Nginx
NGNIX 強制 HTTPS
對於我的 Webapp(Angular App),我們使用 NGNIX 作為 Web 伺服器。我有一項任務需要確保所有資產/圖像都通過 HTTPS 載入。
在瀏覽器開發工具中,我看到請求是通過 HTTPS 發送的。但是,響應位置標頭以 HTTP URL 的形式返回(請參見下面的螢幕截圖)。
以下是目前的 NGNIX 配置:
server { listen 80; server_name localhost; root /usr/share/nginx/html; # kill cache add_header Last-Modified $date_gmt; add_header Cache-Control 'no-store, no-cache'; if_modified_since off; expires off; etag off; # Enforce HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # Disable iFrames add_header x-frame-options "SAMEORIGIN" always; # detect and reject CRLF if ($request_uri ~* "%0A|%0D" ) { return 400; } # Fallback to default language if no preference defined by browser if ($accept_language ~ "^$") { set $accept_language "de"; } # Redirect "/" to Angular app in browser's preferred language rewrite ^/$ /$accept_language permanent; if ($uri !~ ^/(en-US|de)) { return 301 /$accept_language$uri$args; } # Everything under the Angular app is always redirected to Angular in the correct language location ~ ^/(en-US|de) { try_files $uri$args $uri$args/ /$1/index.html; # Add security headers from separate file # include /etc/nginx/security-headers.conf; } location /health { access_log off; return 200; add_header Content-Type text/plain; # Enforce HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; } }
非常感謝任何幫助。謝謝
我可以看到 nginx
/en-US/
在你的情況下重定向到。if ($uri !~ ^/(en-US|de)) { return 301 /$accept_language$uri$args; }
我假設由於內部通信(LB 和 nginx 之間)是通過 http/80 進行的,nginx 只是通過 http 重定向負載均衡器,這就是為什麼您在 location 標頭中看到 http 的原因。
我不確定 .png 文件是否實際上是通過 http 傳遞給使用者的。您可以直接從 http 訪問 .png 文件嗎?如果不是,則訪問實際上是通過 https 傳遞的,並且 http 通信僅在內部發生。如果可以,那麼您應該在負載均衡器端設置從 http 到 https 的重定向。
如果您也想在內部強制使用 https,我會這樣嘗試:
return 301 https://$host/$accept_language$uri$args;
您也可以
absolute_redirect
按照理查德在評論中提到的方式進行檢查。