Nginx:將 https:// 改寫為 http://

Nginx:將 https:// 改寫為 http://

我試圖讓 Nginx 重寫對我的伺服器前綴為https://to的網站的傳入請求http://(這是因為該網站上使用的CMS 強制使用URI 而不是相對路徑——本質上透過製作圖像、腳本和樣式表來破壞整個站點不可用)。

我目前正在嘗試改進前任提出的現有指令,但我發現自己受到 Nginx 配置語法知識的限制。這是代碼:

if ($ssl_protocol = "") {
    rewrite ^   https://$http_host$request_uri? permanent;
}

我目前已將此程式碼註解掉,以防止強制重寫http://to https://,但我無法在不破壞網站的情況下反轉該過程。到目前為止,這是我嘗試過的:

if ($ssl_protocol = "https") {
    rewrite ^   http://$http_host$request_uri? permanent;
}

# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
    rewrite ^   http://$http_host$request_uri? permanent;
}

第一個好像沒有什麼效果。傳送到客戶端的 HTML 仍然會發出未被重寫的 HTTPS 請求。

第二個片段似乎也沒有任何效果 - 如果我理解正確的話(儘管我仍然有點驚訝),Nginx 不支持布爾否定。

做到這一點的最佳方法(或工作方法)是什麼?

編輯:我嘗試添加@NathanC 答案中的代碼;但是,這種無條件重寫會導致重定向循環。仍然感謝幫助。

答案1

更乾淨的方法是:

if ( $scheme = "https" ) {
    return 301 http://example.com$request_uri

或介於 Nathans 答案之間,您的預設 ssl 伺服器區塊僅包含return 301 (無論是哪個 ssl 區塊,您都必須仔細查看您的 ssl 區塊,看看它是如何實現和適應的)為簡單的重定向做正規表示式沒有意義

return-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

編輯:我剛剛注意到有一個變數$https可以在 if 語句中使用。" "如果不是 https 則傳回

if ( $https = "on" ) {
    ...

請記住,在測試更改時,您應該使用302臨時重定向而不是301永久重定向,以便在您發現一小時前修復了它但更改沒有反映在您的瀏覽器中時避免麻煩:)

答案2

你甚至不需要這個,因為你可以強制所有 https 流量轉到 http,如下所示:

server {
        listen 443;
        ssl on;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

參考:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http

相關內容