Назад | Перейти на главную страницу

Nginx Rewriting: PHP-файл внутри директивы Location не обслуживается

Я пытаюсь перенаправить подкаталог в файл php. Вместо того, чтобы обслуживать файл, он загружает его, а это означает, что он не читает его как файл php.

Точнее в fastcgi не входит location ~ \.php$ директива.

Несколько интересных фактов:

Я прочитал документацию Wiki Nginx по этой теме, поэтому я знаю приоритеты, в которых nginx читает директивы местоположения, но это не говорит мне, что делать в этом случае! Я также читаю

Вот конфиг:

server {
 listen  80;

 server_name tyba-one.com *.tyba-one.com;
 root /var/www/tyba/public_html;
 rewrite_log on;
 error_page 404 /404.php;
 client_max_body_size 4M;

 if ($host ~* ^www\.(.*)){
  set $host_without_www $1;
  rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
 }

 location = / {
   rewrite ^/$ /index.php last;
 }

 location ^~ /login {
  rewrite ^(/login)$ $1/ permanent;
  rewrite ^/login/$ /login.php last;
  rewrite ^/login/(.+\.php)$ /$1 last;
 }    

 location ^~ /admin {
  rewrite ^(/admin)$ $1/ permanent;
  rewrite ^/admin/$ /page_builder.php last;
  rewrite ^/admin/(.+\.php)$ /$1 last;
 }

 location ~ \.php$ {
  try_files $uri =404;
  include /opt/nginx/conf/fastcgi_params;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /var/www/tyba/public_html$fastcgi_script_name;
 }
}

Я хотел бы понять, что происходит, и как быть в таких ситуациях.

nginx обрабатывает только один блок местоположения на каждом уровне вложенности, поэтому /login.php обрабатывается ^~ /login блок, а не ~ \.php$ блок. Поскольку у вас есть только операторы перезаписи в ваших блоках местоположения, вам фактически не нужны блоки местоположения (при условии, что совпадения перезаписи достаточно конкретны, каковы ваши). Просто переместите свои операторы перезаписи в корень server блокировать, чтобы запросы на /login и /admin все еще использовать \.php$ блок местоположения:

rewrite ^/$ /index.php last;
rewrite ^(/login)$ $1/ permanent;
rewrite ^/login/$ /login.php last;
rewrite ^/login/(.+\.php)$ /$1 last;
rewrite ^(/admin)$ $1/ permanent;
rewrite ^/admin/$ /page_builder.php last;
rewrite ^/admin/(.+\.php)$ /$1 last;

location ~ \.php$ {
    ...
}