#nginx-location
Вопрос:
В следующем файле конфигурации сайта я пытаюсь:
- Загрузить index.php во время первого визита.
- Загружайте файлы так, как они отображаются в каталоге /uploads/.
- Любой другой запрос все равно должен быть обработан index.php.
server { listen 80 default_server; listen [::]:80 default_server; root /home/va/www/example; # Add index.php to the list if you are using PHP # index index.php; server_name example.dev; location ~ .* { try_files /dev/null @php; } location /uploads/ { try_files $uri =404; expires 30d; } location @php { include snippets/fastcgi-php.conf; #pretty url fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } }
Однако последняя часть обрывается. Другими словами:
/ works
/?test=test works
/uploads/test.jpeg works
/random_string does not work and returns 404 error
Насколько я понимаю, location ~ .*
у этого нет другого выбора, кроме как соответствовать всему. Откуда берется ошибка 404?
Ответ №1:
ОК. Поработав над этим еще немного и полностью переписав логику, я получил музу из руководства MediaWiki Nginx. Окончательное решение заключается в:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /home/va/www/example;
server_name example.dev;
location = /
{
return 301 /home;
}
location = /index.php
{
include snippets/fastcgi-php.conf;
#pretty url
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location /uploads/
{
try_files $uri =404;
expires 30d;
}
location /
{
rewrite ^/(?<pagename>.*)$ /index.php;
}
location /classes/ { deny all; }
location /config/ { deny all; }
}
Затем я буду использовать $_SERVER['REQUEST_URI']
в PHP для маршрутизации запроса. Надеюсь, это решение кому-нибудь поможет.