NGINX:本機重新導向到 _

NGINX:本機重新導向到 _

nginx 版本/1.18.0 (Ubuntu) — Ubuntu 22.04.01 LTS x86_64 核心 6.0.8


我有一個伺服器(上面的安裝規範),它有多個主機名,正在運行 nginx,並且一切正常(包括 nginx,從 http: 重定向到 https:)。

事實上,我在預設伺服器中是這樣做的:

listen 80 default_server;

listen 443 default_server ssl;
# force https-redirects
if ($scheme = http) {
  return 301 https://$host$request_uri;
}

server_name _;

這是奇怪的行為:

網址 重新導向至 筆記
http://mumblefrotz/ https://mumblefrotz/ (按預期工作)
http://mumblefrotz.fullyqualified.com/ https://mumblefrotz.fullyqualified.com/ (按預期工作)
http://127.0.0.1/ https://127.0.0.1/ (按預期工作)
http://localhost/ https://_ 失敗

為什麼它要這麼做? 我懷疑這與server_name指令按字面意思理解,儘管我不太確定為什麼它只發生在localhost.

在看著這個堆疊溢位建議,我嘗試了以下兩項,但仍然得到了令人驚訝的下劃線:

  • server_name ~.;
  • server_name ~^(.+)$;

我的期望$hostHTTP 請求中傳遞的主機名,如果已定義,則虛擬主機會選擇它,如果未定義,則回退到預設伺服器定義。

據我所知,http://localhost/這是唯一沒有正確解決的問題。我想解決這個問題。

答案1

沒有關於使用哪個客戶端發出請求的問題的資訊。正如所寫Nginx 文檔$host變數包含:

按此優先順序:請求行中的主機名,或「Host」請求標頭欄位中的主機名,或與請求相符的伺服器名稱

GET這裡,「請求行」是指HTTP請求中動詞後面的主機名稱。

第二個表示Host標頭欄位。

第三個表示 中配置的名稱server_name

在您的情況下,我認為測試客戶端執行了一個不包含Host標頭的請求。因此nginx使用了變數server_name內容的配置$host

就我個人而言,我只是為每個虛擬伺服器產生 HTTP -> HTTPS 轉送區塊,因為我使用 Ansible 管理 nginx 配置。這樣我就可return 404以為我不感興趣的所有其他主機名稱提供一個虛擬主機。

但如果您需要為重定向實作通用虛擬主機,您可以使用以下方法:

map $http_host $redirect_host {
    ~ (^.+$) $http_host;
    default  example.com;
}

server {
    listen 80 default_server;
    ...

    if ($scheme = http) {
        return 301 https://$redirect_host$request_uri;
    }
}

這始終使用 HTTP 主機標頭作為重定向目標,除非沒有Host標頭。在這種情況下,它用於example.com重定向目標。例如,您可以將主網域指定為重新導向目標。

相關內容