Rewrite
Nginx重寫:未提供Location指令內的PHP文件
我正在嘗試將子目錄重定向到 php 文件。它不提供文件,而是下載它,這意味著它不會將其作為 php 文件讀取。
更準確地說,它沒有進入 fastcgi
location ~ \.php$
指令。一些有趣的事實:
- 一切對集團來說都很好,但對整個
admin
集團來說卻不是login
。- 當我將
location ~ \.php$
指令移到上面login
並更改^~ /login
為~ /login
時,它適用於重寫規則rewrite ^/login/(.+\.php)$ /$1 last;
。我確實閱讀了有關該主題的 Wiki Nginx 文件,因此我知道 nginx 讀取位置指令的優先級,但這並沒有告訴我如何處理這種情況!我也讀過
- 類似的問題https://stackoverflow.com/questions/10126117/need-help-understanding-configuring-an-nginx-location-directive(未回答)
- https://stackoverflow.com/questions/11961323/howto-setup-window-nginx-virtual-directory-with-php-support我試圖實現但沒有成功
- https://stackoverflow.com/questions/1011101/nginx-location-directive-doesnt-seem-to-be-working-am-i-missing-something涵蓋了真實(非虛擬)子文件夾的情況。
這是配置:
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$ { ... }