В NGINX «местоположение ~ . *» не соответствует ни одной строке

#nginx-location

Вопрос:

В следующем файле конфигурации сайта я пытаюсь:

  1. Загрузить index.php во время первого визита.
  2. Загружайте файлы так, как они отображаются в каталоге /uploads/.
  3. Любой другой запрос все равно должен быть обработан 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 для маршрутизации запроса. Надеюсь, это решение кому-нибудь поможет.