我正在通過 index.php 檔案路由所有內容。我不希望任何人直接訪問我的 /var/www/html 目錄中的 php 檔案,但 index.php 除外。
我有這個來禁用對 php 檔案的訪問:
location ~ /*.php {
return 404;
}
但不幸的是,我的 index.php 檔案仍然得到 404。
我正在使用以下內容通過 index.php 路由所有內容:
location / {
try_files $uri $uri/ /index.php?$args;
}
我怎樣才能讓這兩個同時作業?
uj5u.com熱心網友回復:
使用您的配置,您會為任何包含php子字串的請求回傳 HTTP 404 Not Found :
'/*' '.' 'php'
| | |
| | --- 'php' substring
| ---------- any single char
----------------- 0 or more '/' chars
我不認為這真的是你寫的意思。匹配任何結尾的正確正則運算式模式.php是\.php$一個。檢查 PCRE 正則運算式模式語法以獲取其他資訊。
要匹配所有 PHP 檔案,index.php您可以使用精確匹配位置(優先于正則運算式匹配位置):
location / {
try_files $uri $uri/ /index.php?$args;
}
location = /index.php {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass <your_PHP-FPM_backend>;
}
location ~ \.php$ { # will be used for any PHP request except 'index.php'
return 404;
}
使用^~位置修飾符可以實作相同的目的。如果最長匹配前綴位置具有^~修飾符,則不檢查正則運算式:
location / {
try_files $uri $uri/ /index.php?$args;
}
location ^~ /index.php {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass <your_PHP-FPM_backend>;
}
location ~ \.php$ { # will be used for any PHP request except 'index.php'
return 404;
}
如果您index.php在不同目錄中有多個檔案,以前的解決方案將不起作用,您需要使用兩個正則運算式匹配位置:
location / {
index index.php;
try_files $uri $uri/ /index.php?$args;
}
location ~ /index\.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass <your_PHP-FPM_backend>;
}
location ~ \.php$ { # will be used for any PHP request except 'index.php'
return 404;
}
這是位置塊順序很重要的唯一配置。location ~ /index\.php$ { ... }應該是第一個,否則任何 PHP 檔案請求都將被第location ~ \.php$ { ... }一個阻止。
檢查location指令描述和nginx 如何處理請求檔案頁面以獲取更多資訊。您還可以檢查Nginx 將所有流量重定向到 index.php,但不允許任意檔案訪問SO 執行緒以獲取一些其他示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/339936.html
