![NGINX:本機重新導向到 _](https://rvso.com/image/782624/NGINX%EF%BC%9A%E6%9C%AC%E6%A9%9F%E9%87%8D%E6%96%B0%E5%B0%8E%E5%90%91%E5%88%B0%20_.png)
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 ~^(.+)$;
我的期望$host
是HTTP 請求中傳遞的主機名,如果已定義,則虛擬主機會選擇它,如果未定義,則回退到預設伺服器定義。
據我所知,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
重定向目標。例如,您可以將主網域指定為重新導向目標。