
Я пытаюсь организовать блок местоположения для любого, кто получает через mydomain.com/game/admin
URL, убедитесь, что сервер nginx для извлечения контента существует в /var/www/html/my-cakephp-app/
каталоге. Мое приложение создано с использованием фреймворка cakephp, и его структура каталогов показана ниже:
- /var/www/html/my-cakephp-app/
- админ
- Конфигурация
- Консоль
- Контроллер
- Вид
- webroot (файл index.php точки входа приложения находится в этом каталоге)
Также у меня есть статический html/css сайт, расположенный в /var/www/html
каталоге. Так что любой, у кого есть mydomain.com
url, может увидеть этот сайт тоже.
Вот мой текущий блок сервера nginx:
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html index.htm index.php;
server_name mydomain.com;
location / {
try_files $uri $uri/ =404;
}
location /game/admin {
return 301 /game/admin/;
}
location /game/admin/ {
root /var/www/html/my-cakephp-app/admin/webroot;
try_files $uri $uri/ /game/admin/index.php$is_args$args;
location ~* \.php(/|$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
С этой настройкой мой статический веб-сайт работает нормально. Но приложение cakephp выдает ошибку 404 not found в браузере. В nginx/error.log ошибок нет.
Но когда я запускаю с конфигурацией nginx ниже, мое приложение работает нормально. Но мне нужно избавиться от моего сайта html/css. Я планирую обновить приложение html/css с помощью сайта wordpress. Поэтому у меня должна быть возможность запустить сайт wordpress как родительский.
server {
listen 80;
server_name mydomain.com;
root /var/www/html/my-cakephp-app/admin/webroot;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
autoindex on;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Я не могу вспомнить, что я сделал неправильно с первым серверным блоком. Любые предложения были бы очень полезны.
решение1
Две основные проблемы:
- внешний
location ~ \.php$
блок имеет приоритет надlocation /game/admin/
блоком, если вы не используете^~
модификатор (см.этот документдля подробностей) - Директива
root
генерирует путь к файлу путем простой конкатенации, поэтому ожидается, что ваш контроллер будет расположен по адресу/var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php
(см.этот документдля подробностей)
Один из вариантов — переместить проект так, чтобы структура каталогов соответствовала структуре URI. Этого можно добиться с помощью символической ссылки, которая указывает /var/www/html/game/admin
на , /var/www/html/my-cakephp-app/admin/webroot
в этом случае внешний location ~ \.php$
блок сможет выполнить оба проекта.
Другой вариант — alias
директива. См.этот документдля получения подробной информации.
location ^~ /game/admin {
alias /var/www/html/my-cakephp-app/admin/webroot;
if (!-e $request_filename) { rewrite ^ /game/admin/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
Обратите внимание, что это $document_root$fastcgi_script_name
не будет работать alias
, и $request_filename
вместо этого следует использовать .
Я избегаю использования alias
и try_files
вместе из-заЭта проблема. Видетьэта осторожностьпо использованию директивы if
.