為什麼 Nginx 接受根網域之後的任何 URL 值?

為什麼 Nginx 接受根網域之後的任何 URL 值?

第一次設定 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 是否足夠好以進一步幫助您。

相關內容