Rewrite

Nginx重寫:未提供Location指令內的PHP文件

  • December 8, 2021

我正在嘗試將子目錄重定向到 php 文件。它不提供文件,而是下載它,這意味著它不會將其作為 php 文件讀取。

更準確地說,它沒有進入 fastcgilocation ~ \.php$指令。

一些有趣的事實:

  • 一切對集團來說都很好,但對整個admin集團來說卻不是login
  • 當我將location ~ \.php$指令移到上面login並更改^~ /login~ /login時,它適用於重寫規則rewrite ^/login/(.+\.php)$ /$1 last;

我確實閱讀了有關該主題的 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$location 塊:

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$ {
   ...
}

引用自:https://serverfault.com/questions/486807