对于我的 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;
}
}
非常感谢您的帮助。谢谢
答案1
/en-US/
我可以看到,在你的情况下,nginx 正在重定向到。
if ($uri !~ ^/(en-US|de)) {
return 301 /$accept_language$uri$args;
}
我假设由于内部通信(LB 和 nginx 之间)是通过 http/80 进行的,所以 nginx 只是通过 http 重定向负载均衡器,这就是您在位置标头中看到 http 的原因。
我不确定 .png 文件是否真的通过 http 传递给用户。您可以直接从 http 访问 .png 文件吗?如果不能,则访问实际上是通过 https 传递的,并且 http 通信仅在内部进行。如果可以,那么您应该在负载均衡器端设置从 http 重定向到 https。
如果您也想在内部强制使用 https,我会尝试这样做:
return 301 https://$host/$accept_language$uri$args;
您还可以检查absolute_redirect
理查德在评论中提到的内容。