Nginx 將舊的 PHP url 視為文件
很難弄清楚這一點。我已將我的網站從另一個平台更改為 Joomla,現在 Nginx 無法處理舊網址。
我的舊網址是這樣的:
example.com/home.php example.com/contact-us.php
我的新 Joomla SEF 網址是這樣的:
example.com/home example.com/contact-us
根據 Joomla 指南,我有以下 Nginx 配置:
location / { try_files $uri $uri/ /index.php?$args; } # Process PHP location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
我希望 Nginx 將這些舊網址傳遞給 Joomla 來處理它。現在,正在發生的事情是,Nginx 將這些舊網址視為 php 文件,然後向我顯示此
No input file specified.
錯誤。然後我將 php 塊中的 try_files 更改為,try_files $uri /index.php?$args;
因此我的 Nginx 配置如下所示:location / { try_files $uri $uri/ /index.php?$args; } # Process PHP location ~ \.php$ { try_files $uri /index.php?$args; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
這是有效的嗎?在某些情況下,這會導致無限循環問題嗎?這是正確的方法嗎?我沒有找到任何類似的解決方案。有人可以指導我嗎?
location /
從未使用過您遇到的問題與位置優先級有關(已添加重點)。
無論列出的順序如何,nginx 首先搜尋由文字字元串給出的最具體的前綴位置。
$$ … $$然後 nginx 按照配置文件中列出的順序檢查正則表達式給出的位置。第一個匹配的表達式停止搜尋,nginx 將使用這個位置。如果沒有正則表達式匹配請求,則 nginx 使用之前找到的最具體的前綴位置。
因此,這個位置塊:
location ~ \.php$ { try_files $uri =404; # <-
匹配此請求:
example.com/home.php
並且沒有其他位置塊是相關的。
正如您已經意識到的那樣,這意味著 nginx 將嘗試查找和服務,
home.php
從而導致 404。對主 index.php 文件使用 @location
通常唯一相關的 php 文件是
index.php
,您可以像這樣使用它:try_files $uri $uri/ @joomla; location @joomla { include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME $document_root/index.php; fastcgi_param DOCUMENT_URI /index.php; fastcgi_index index.php; }
對 *.php 請求使用另一個位置塊
除了前端控制器之外,joomla 還允許/期望直接訪問其他 php 文件,例如
/administrator/index.php
. 要允許訪問它們而不嘗試處理失去的 php 文件:location ~ \.php$ { try_files $uri @joomla; include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
這將允許直接訪問其他 php 文件(通常,這不是一件好事……)回退到 use
/index.php
,通過該@joomla
位置,用於任何不存在的 php 文件請求。請注意,上述設置也在文件中。