第一次設定 Nginx,我的目標是讓 example.com 具有靜態“index.html”頁面,並提供極簡配置,僅此而已。我還想刪除 www 子網域。以下是我的網站可用的伺服器區塊:
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name example.com;
root /var/www/example.com/;
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
}
如果我使用 www.example.com 或 example.com,它們工作正常,www 會自動刪除。
我的問題是我可以在 example.com 之後輸入任何內容,但 index.html 頁面仍然會加載,例如 example.com/ABC 或 example.com/12345。這些頁面不存在,為什麼會接受這些 URL?我希望除域根之外的任何 URL 都會返回 404 頁面。
這可能是一個非常簡單的問題,但我嘗試在此處和文件中搜索,但到目前為止我什麼也沒得到。
答案1
這似乎是 try_files 子句的正確行為。來自 nginx 維基:
依序檢查檔案是否存在,並傳回找到的第一個檔案。尾部斜線表示目錄 - $uri /。如果未找到文件,則會呼叫到最後一個參數的內部重定向。請注意,只有最後一個參數會導致內部重定向,前面的參數只會設定內部 URI 指標。
因此,如果您尋找無法找到的 ABC 或 12345,則會呼叫到 index.html 的內部重定向。
嘗試使用:
location / {
try_files $uri $uri/ =404;
}
在這裡查看完整的參考:
http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
基於 Martin Fjordvald 的評論這是兩個伺服器區塊的最小配置,經過測試並正常工作:
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name example.com;
root /var/www/example.com/;
index index.html index.htm;
}
答案2
我能想到的兩件事:
要嘛你有一個重寫規則回到index.html
或者您可能有一個連結回index.html的自訂404頁面
至少這是我首先要檢查的兩個想法。
其他可能的解決方案是檢查日誌,設定要調試的值,並檢查什麼“重定向”您回到index.html,遺憾的是我不知道 nginx 是否足夠好以進一步幫助您。