我正在使用 NGINX,并且我有 example.com 的 SSL 证书,但我没有 www.example.com 的 SSL 证书。
简单来说:
我尝试配置 NGINX 将所有 www 请求重定向到非 www(来自**http**://www.example.com
和**https**://www.example.com
到https://example.com
)。尽管我对或多或少相似的问题使用了不同的答案,但我要么得不到结果,要么服务器停止响应 :(
总体来说这就是问题所在,现在我将深入探讨细节:
现在我的 NGINX 配置如下:
upstream puma_example_production {
server unix:/var/www/example/shared/tmp/sockets/puma.sock fail_timeout=0;
}
#server {
# listen 80;
# listen 443 ssl;
# server_name www.example.com;
# return 301 https://example.com$request_uri;
#}
server {
listen 80;
listen 443 ssl;
ssl on;
ssl_certificate /var/certs/ssl.crt;
ssl_certificate_key /var/certs/sslkey.key;
server_name example.com;
root /var/www/example/current/public;
try_files $uri/index.html $uri @puma_example_production;
client_max_body_size 4G;
keepalive_timeout 10;
error_page 500 502 504 /500.html;
error_page 503 @503;
# return 301 https://example.com$request_uri;
location @puma_example_production {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://puma_example_production;
# limit_req zone=one;
access_log /var/www/example/shared/log/nginx.access.log;
error_log /var/www/example/shared/log/nginx.error.log;
}
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
location = /50x.html {
root html;
}
location = /404.html {
root html;
}
location @503 {
error_page 405 = /system/maintenance.html;
if (-f $document_root/system/maintenance.html) {
rewrite ^(.*)$ /system/maintenance.html break;
}
rewrite ^(.*)$ /503.html break;
}
if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
return 405;
}
if (-f $document_root/system/maintenance.html) {
return 503;
}
}
我注释了导致错误的方法。现在我的服务器可以正常处理非 www 请求,但处理 www 请求时,浏览器会警告我没有 SSL 证书 (NET::ERR_CERT_COMMON_NAME_INVALID)(这是真的)。
我希望有正确的方法将 www 重定向到非 www。你能帮帮我吗?
答案1
您好,欢迎来到 Server Fault!
尝试分离你的server
指令:
server {
# No configuration for 443
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
和
server {
# No configuration for 80
listen 443 ssl;
ssl on;
ssl_certificate /var/certs/ssl.crt;
ssl_certificate_key /var/certs/sslkey.key;
[...]
}
请记住,通过这种方式完成的重定向仅适用于GET
请求,而不适用于POST
。