2012-08-23 105 views
9

下面是我的nginx.conf。Try_files不打PHP(NginX配置)

如果不存在的文件/index.php送達罰款。

但是,當我的URL是/foo/bar => /foo/bar/index.php通過下載作爲PHP源代碼。

任何想法?

try_files $uri $uri/ $uri/index.php /index.php; 

location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include fastcgi_params; 
} 
+2

我有同樣的問題。如果我點擊一個映射到不存在的文件的url,它會正確執行index.php。但是,如果我放置一個新的php文件並嘗試直接點擊該文件,我會得到它的源代碼 –

+0

您是否開始使用fastcgi服務? –

+0

:-)如果我放置不存在的URL,那麼它甚至可以提供最後一個選項/index.php。 –

回答

4

解決方案是增加指數的index.php

index index.php 

    try_files $uri $uri/ $uri/index.php /index.php; 

    location ~ \.php$ { 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
+7

實際上,解決方案是使用命名的位置作爲'try_files'的最終參數。問題是內部重定向(即嘗試檢查是否有任何其他正則表達式,例如PHP處理正則表達式)僅針對最終的後備參數發出。在你的問題的配置中,對'/ index.php'的請求甚至沒有嘗試匹配正則表達式。你的答案工作的原因是因爲如果訪問任何東西,'index anything'將發出內部重定向,導致實際的PHP正則表達式匹配。 –

+2

@ MahmoudAl-Qudsi你可以發佈一個答案,顯示如何使用命名的位置 –

1

我的配置

index index.html index.htm index.php; 
location ~ \.php$ { 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     include fastcgi_params; 
     } 

重裝nginx的和FastCGI都

+0

我在說try_files。其實我需要更多的模式來用於像drupal和passenger這樣的try_files。但添加索引index.php解決了這個問題。謝謝。 –

0

我也有同樣的問題。當我在PHP環境(location ~ ^(.+\.php)(.*)$ { ...)以下:

try_files $fastcgi_script_name =404; 

..它總是返回404最後我讀了try_files docs,在那裏說:

到的文件的路徑構造從文件參數根據根和別名指令。

我只爲每個位置塊中定義alias(並沒有在PHP-FPM塊,當然),但沒有一個整體root位置設置過,所以Nginx的不知道到哪裏尋找一份文件。一旦我爲服務器塊設置了root,它就開始工作。