
我在互聯網上有一個代理應用程式的 nginx 實例。我想對來自互聯網的任何嘗試對應用程式進行身份驗證的請求返回 404,因為它的所有公共部分都允許匿名訪問。只有本地網路上的使用者才能對其進行身份驗證。
我想我可以使用一個簡單的 if 區塊,因為我只是使用 return 404,但我不確定檢測身份驗證標頭是否存在的最可靠的 if 條件是什麼:
if (auth headers exist) {
return 404;
}
有人對我可以在 if 區塊中放入什麼來檢查這一點有建議嗎?
答案1
一般來說,不建議使用 if 語句,或者您至少應該意識到一些副作用。讀nginx 部落格上的“If is Evil”了解更多。
回答您的問題:假設您要檢查的標頭稱為“授權”,您最初的假設已經非常準確。
if ($authorization) {
return 404;
}
這應該已經可以解決問題了。此外,如果您只想對公共伺服器區塊強制執行此操作,您可以使用ngx_http_access_模組
答案2
您可以檢查請求中是否存在 Authorization 標頭,該標頭通常用於對請求進行身份驗證。您可以透過在 if 區塊中使用 $http_authorization 變數來完成此操作:
if ($http_authorization) {
return 404;
}
或者,您可以檢查應用程式使用的特定身份驗證標頭是否存在。例如,如果您的應用程式使用 X-Auth-Token 作為身份驗證標頭,您可以像這樣檢查它:
if ($http_x_auth_token) {
return 404;
}
請記住,只有在向受 auth_basic 指令保護的位置發出請求時,才會評估 if 區塊。如果您想要檢查所有請求中是否存在身份驗證標頭,您可以使用 map 指令:
map $http_authorization $block_public_auth {
default 0;
"~" 1;
}
server {
...
location / {
if ($block_public_auth) {
return 404;
}
...
}
}
上面將阻止所有帶有授權標頭的請求,無論其位置如何。