Nginx

Nginx 將舊的 PHP url 視為文件

  • January 10, 2015

很難弄清楚這一點。我已將我的網站從另一個平台更改為 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 文件請求。

請注意,上述設置也在文件中

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