我正在嘗試使用 nginx 作為反向代理的個人專案,該專案的基本前提是任何靜態內容都應始終提供給用戶,并且任何 api 請求都必須經過身份驗證。任何身份驗證失敗都會立即強制頁面重定向到 /login 頁面。我已經成功實施了大部分專案:auth_request 已啟用并正常作業,內容已提供并且作業正常。
我的問題是我似乎無法在失敗的 api 請求上處理來自 /login 位置的內容;我已將問題簡化為以下一些可重復的代碼:
server {
listen 81;
location /login {
root /etc/nginx/websites/login;
index index.html;
}
}
關于我的配置的一些注意事項:
- 我正在運行 Windows 機器并使用 linux docker 容器
- 上面的 81 埠映射到我本地機器上的 80 埠——我不想改變它。
- 路徑 /etc/nginx/websites/login;映射到我本地機器上的一個檔案夾,其中包含一個構建的 Vue3 專案分發檔案夾。它包含一個 index.html 檔案,以及其他 js/ 和 css/ 可分發檔案。
- 我已經通過瀏覽到容器內的相同位置并確保至少存在相同的檔案來驗證這一點。
- 這可能不言而喻,但無論如何我都會說:在每次組態檔更改之間,我正在運行 nginx -s reload 并且在以下每種情況下都沒有回傳錯誤。
我希望當我瀏覽到 localhost/login 時,請求將通過 location 塊映射并加載 /login/index.html 頁面。使用上面的代碼,在 chrome 上,我得到 404 not found。
我也試過:
server {
listen 81;
location /login/ {
root /etc/nginx/websites/login;
index index.html;
}
}
并得到同樣的錯誤。
如果我將根修改為:
root /etc/nginx/websites/login/;
問題仍然存在。
如果我嘗試:
server {
listen 81;
location /login {
return 200 'It's heeeere';
}
}
然后 chrome 會下載一個包含上述文本的檔案。
如果我嘗試使用別名,那么整個請求將被重定向到 localhost:81/login 并完全失敗 - 正如人們所期望的那樣。
我不禁覺得我錯過了一些完全明顯的東西,但是連續 15 個小時之后,即使答案跳出頁面并打了我一巴掌,我也可能會忘記它!
除了配置盲點,為了避免任何“RTFM”回應,我已經瀏覽了檔案中的這個頁面:https ://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/ ,據我了解,至少我在上面發布的配置之一應該可以作業。
感謝您在幫助我擺脫這個配置地獄的深坑時提供的任何幫助。非常感謝,
史蒂夫
編輯 自從原始帖子以來,我已經從 docker 簽出日志(我也有從 nginx 寫入的日志,并且希望它們相似,但在這種情況下顯然不是),并且在訪問端點時它報告:open( )“/etc/nginx/websites/login/login”失敗(2:沒有這樣的檔案或目錄)。
這讓我很困惑,我希望 index.html 頁面是默認的索引頁面,而我的顯式宣告應該確保它是。
另一個編輯 似乎我比我預期的更傻,我又看了一下配置,意識到第二個 /login 不是一個檔案,而是一個檔案夾。因此將根指令更改為:
root /etc/nginx/websites/;
雖然它不再拋出 404,但它不會向 localhost:81/login 回傳 301,正如我之前所說的那樣,它不是我本地機器上的有效端點。
uj5u.com熱心網友回復:
所以 URI/login應該回傳/login/index.html?
該index指令僅適用于以 結尾的 URI /,這就是您重定向到localhost:81.
你想如何解決這個問題?
如果您將原始 URI 更改/login/為問題就消失了。
否則使用try_files $uri /login/index.html =404;強制 Nginx 回傳索引檔案而不進行重定向。
其他注意事項:使用port_in_redirect off;和/或server_name_in_redirect off;實作適用于您的實作的重定向。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511191.html
