我想将所有非 https 和非 www 重定向到 301,使用https://www.example.com
我在另一个线程中找到的以下配置作为可接受的答案。但这对我来说不起作用。
有效的方法:
https://example.com
->https://www.example.com
http://example.com
->https://www.example.com
但...
http://www.example.com
-> 重定向太多... 使用 curl 我可以看到它总是重定向到自身...
这是我的nginx.conf
:
server {
# ports
listen 80;
listen [::]:80;
# domain name
server_name example.com www.example.com;
# Redirect all non-https requests
rewrite ^ https://www.example.com$request_uri? permanent;
}
server {
if ($bad_referer) {
return 444;
}
if ($bad_bot) {
return 444;
}
# ports
listen [::]:443 ssl http2;
listen 443 ssl http2;
# domain name
server_name example.com www.example.com;
if ($host = 'example.com') {
return 301 https://www.example.com$request_uri;
}
# ssl certificate files
ssl_certificate /etc/ssl/certs/domain.crt;
ssl_certificate_key /etc/ssl/private/domain.key;
include basic.conf;
}
有任何想法吗?
更新:这变得越来越奇怪了...我试图制定一条一般规则将所有内容路由到 ssl(正如许多博客所建议的那样)......现在 www 以及非 www 版本都重定向回其自身......
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
我不知道如何调试这个...顺便说一句...这是一个 docker swarm 集群...如果这有帮助的话......
答案1
经过我自己测试之后,我不得不编辑我原来的答案,因为它导致了错误conflicting server name
。
遗憾的是,我无法告诉您为什么仍然会出现此重定向循环 - 也许错误来自您的包含。但我可以向您展示一个可行(经过测试)的配置,它可以完成您的要求:
一般来说:对于相当简单的重定向,建议使用指令return
而不是redirect
(https://www.nginx.com/blog/creating-nginx-rewrite-rules/)
目标:任意组合
- 计划(
http
或https
) - 和域(
example.com
或www.example.com
)
你在浏览器中输入,你将被重定向到https://www.example.com
以下是配置:
server {
listen 80;
server_name www.example.com redirecttest.de;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
root /var/www/example.com/http;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
}