Этот вопрос импортирован из SO. Я сохранил правку, сделанную с комментариями, поэтому нам не нужно повторять ее еще раз :). Ссылка на ОП: https://stackoverflow.com/questions/57503107/trouble-making-nginx-works-with-symfony-in-subdirectory
Я пытаюсь установить Symfony 4 рядом с уже работающим сайтом WordPress с помощью nginx. Wordpress должен управлять домашней страницей по адресу
и сообщения в блоге под
Приложение Symfony должно заменить все, что находится под
Я прочитал стандартную документацию бота Вот и Вот а также устранение неполадок Вот. Кроме того, он кажется ДЕЙСТВИТЕЛЬНО близким к этому вопросу, но с nginx вместо apache: https://stackoverflow.com/questions/53895202/symfony4-routing-inside-a-subfolder
Дело в том, что я все еще не могу заставить его работать. Вот мой текущий site.conf, который дает мне 404, но я действительно не могу найти полезный журнал даже с включенной опцией отладки в nginx.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.my.domain;
root /var/www/my.domain/html;
#symfony location block
location /app {
alias /var/www/my.domain/app/public;
index index.php;
try_files $uri /app/public/index.php/$1 last;
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
#Wordpress location block
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
location ~* \.(css|js|ico|gif|jpeg|jpg|webp|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
expires max;
}
location ~ /\.ht {
deny all;
}
}
}
Наконец я попробовал кое-что найти Вот. На этот раз это дает мне следующую ошибку маршрутизации Symfony: Не найден маршрут для "GET / app". Ниже файла conf:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.my.domain;
root /var/www/my.domain/html;
# Symfony location block
location /app {
alias /var/www/my.domain/app/public;
index index.php;
rewrite ^/app/(.*)$ /$1 break;
try_files $uri @symfonyFront;
}
set $symfonyRoot /var/www/my.domain/app/public;
set $symfonyScript index.php;
location @symfonyFront {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $symfonyRoot/$symfonyScript;
fastcgi_param SCRIPT_NAME /app/$symfonyScript;
fastcgi_param REQUEST_URI /app$uri?$args;
}
#Wordpress location block
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
location ~* \.(css|js|ico|gif|jpeg|jpg|webp|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
expires max;
}
location ~ /\.ht {
deny all;
}
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.my.domain/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.my.domain/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
В обоих случаях wordpress работает так, как задумано. Сообщения на домашней странице и в блогах отображаются, когда ожидалось. Однако приложение Symfony отсутствует. В первом случае я получил ошибку 404 при посещении my.domain / app, а второй выдает ошибку маршрутизации Symfony. Это означает, что я попал в передний контроллер SF. И я получил трассировку стека ядра, говорящую, что приложение маршрута / не найдено в Symfony. И это абсолютно правильно, так как я ожидаю, что symfony будет работать в этом каталоге, и он не должен быть пользователем для маршрутизации.
На данный момент я даже не уверен, какой из них приближает меня к желаемому результату. Любые чаевые будут оценены!
РЕДАКТИРОВАТЬ: etc / nginx / error.log с активированной отладкой показывает много строк, но это привлекло мое внимание:
2019/08/15 18:11:42 [предупреждение] 6929 # 6929: * 5 "псевдоним" нельзя использовать в местоположении "/ app", где был переписан URI, клиент: 86.252.250.94, сервер: www.my.domain, запрос: «GET / app / HTTP / 1.1», хост: «www.my.domain»
И когда я получил ошибку route not found, я получил это (что и ожидалось) в журнале Symfony:
[2019-08-15 18:26:00] request.ERROR: Uncaught PHP Exception Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException: "Не найден маршрут для" GET / app "" в /var/www/my.domain/ app / vendor / symfony / http-kernel / EventListener / RouterListener.php строка 141 {"исключение": "[объект] (Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException (код: 0): не найден маршрут для \" GET / app \ "в /var/www/my.domain/app/vendor/symfony/http-kernel/EventListener/RouterListener.php:141, Symfony \ Component \ Routing \ Exception \ ResourceNotFoundException (код: 0): маршруты для \ "/ app / \". в /var/www/my.domain/app/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php:70) "} []
EDIT2: я добавил
fastcgi_split_path_info ^ / app (. +. php) (/.+) $;
без заметных изменений. Интересно, что когда я заменил директиву rewrite на «last» вместо «break», она отображает страницу 404 из wordpress.
РЕДАКТИРОВАТЬ: fastcgi-php.conf
@www:~$ sudo cat /etc/nginx/snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
Первая «ошибка» связана с префиксом местоположения (location /something
) без косой черты в конце. Это должно быть location /app/ {
, в противном случае местоположение соответствует app123
.
В try_files
в приложении расположение слишком сложно. Будь проще:
try_files $uri /index.php$is_args$args;
Учитывая, что вы сохранили текущую файловую структуру:
Затем:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.my.domain;
root /var/www/my.domain/html;
#Wordpress location block
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
location ~* \.(css|js|ico|gif|jpeg|jpg|webp|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
expires max;
}
location ~ /\.ht {
deny all;
}
}
#symfony location block
location ^~ /app/ {
index index.php;
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
alias /var/www/my.domain/app/public/;
try_files $uri /index.php$is_args$args;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
# important to use $request_filename with alias
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
# redirect /app to app/
location = /app {
return 301 /app/;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}