Nginx

NGNIX 強制 HTTPS

  • May 14, 2022

對於我的 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按照理查德在評論中提到的方式進行檢查。

引用自:https://serverfault.com/questions/1100903