2012-10-30 27 views
3

我使用nginx配置了一個非常標準的網絡服務器。服務器按預期工作,但是,我想了解一個小配置詳細信息。Nginx:try_files外部位置

我現在的配置是:

index index.html index.htm index.php; 

location/{ 
    try_files $uri $uri/ /index.php?q=$uri; 
} 

location ~ \.php$ { 
    try_files $uri =404; 
    fastcgi_index index.php; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include /etc/nginx/fastcgi_params; 
} 

有了這個配置,如果我訪問:http://myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php我收到了404如預期。

然而,這種配置:

try_files $uri =404; 

location ~ \.php$ { 
    fastcgi_index index.php; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include /etc/nginx/fastcgi_params; 
} 

我得到 「拒絕訪問」 空白頁。

爲什麼結果不同?

謝謝

回答

12

你可能的印象是try_files在服務器級別必須爲每個請求的工作下。一點也不。恰恰相反,它僅適用於與location塊不匹配的請求。

1

短anwser:爲php5.3.9的,PHP-FPM不允許擴展不是因爲security.limit_extensions和默認值已作出了您的請求.php然後.php5其他存在的.png文件。

長答案:這與try_files在位置塊內部或外部無關。讓我們打破,並解釋:

要求是:http://myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php

你的第一個配置

  • location ~ .php$ { ... }塊,因爲該請求與.php結束匹配。
  • try_files $uri =404;指令內.php$位置引起的nginx返回404,因爲沒有文件名爲$ URI(= /可溼性粉劑內容/上傳/ 2012/10 /裁剪-bitmap11.png/lol.php)
  • location/{ ... }塊從未匹配。只有在沒有其他位置塊匹配的情況下才會匹配。 (見http://wiki.nginx.org/HttpCoreModule#location

您的第二配置

  • 再次,作爲請求與.php結束時,它的位置.php$塊相匹配。
  • 沒有檢查爲位置塊內部的文件存在,則請求被直接傳遞給FastCGI進程。
  • FastCGI進程找到/wp-content/uploads/2012/10/cropped-bitmap11.png(appearently,它存在),並拒絕運行,因爲.PNG延伸部的請求,。 (見簡答)

我不知道這是否是一個錯誤或「設計」的事情,但,違背了「根」指令,位置塊外的try_files指令裏面的不繼承位置塊。 (有人可能會糾正這一點,如果這是錯誤的)

+2

'位置塊外的try_files指令不會在位置塊內繼承'我認爲這是關鍵點。如果這是正確的,一切都有道理 –