请教各位大佬一个 nginx 配置问题

2021-10-13 11:55:08 +08:00
 viamcc
目前的问题是 http://example.com 可以正常跳转到 https://example.com ,而直接访问 http://www.example.com chrome 接下载空文件,safari 则无法访问。

请教下各位大佬如何解决 www 这个跳转 https 的问题?

另外有关 http 跳转 https 还有更简洁的配置方法吗?



nginx version: nginx/1.20.1


配置如下:

server
{
listen 80 http2;
server_name example.com wwww.example.com;

return 301 https://$server_name$request_uri;
# rewrite ^(.*)$ https://$host$1 permanent;

location ~ /
{
root /home/wwwroot/serverhome;
index index.html index.htm;
}

}

server
{
listen 443 ssl http2;
server_name example.com www.example.com;

ssl_certificate /usr/local/nginx/ssl/example.com.crt;
ssl_certificate_key /usr/local/nginx/ssl/example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

root /home/wwwroot/serverhome;
index index.htm index.html;

access_log /home/wwwlogs/example.com.log main;

}
1954 次点击
所在节点    NGINX
14 条回复
amrnxcdt
2021-10-13 12:04:06 +08:00
return 301 https://$server_name$request_uri;


换成下面的


rewrite ^(.*)$ https://$host$1 permanent;


试试
meshell
2021-10-13 12:04:22 +08:00
wwww.example.com 四个 wwww 是几个意思?
viamcc
2021-10-13 12:05:38 +08:00
@meshell 发帖子的手手滑编辑多了一个 w,实际没有的哈
gengchun
2021-10-13 12:08:13 +08:00
@amrnxcdt $host 只是第一个 $server_name,这个要看具体需求吧,假如是想把 www 去掉的话,倒是可以。但是这个问题里没有这么描述。而且他这个配置里也注释掉了。
AllenHua
2021-10-13 12:15:53 +08:00
域名 http 转 https 建议这样写 `return 301 https://$host$request_uri;`
xy90321
2021-10-13 13:04:02 +08:00
域名解析里面配了 www 或者 * 了吗?
都没到 nginx 的话怎么改配置都没用
canbingzt
2021-10-13 14:33:12 +08:00
ElmerZhang
2021-10-13 15:09:26 +08:00
试试这个配置
```
server {
listen 80;
server_name example.com wwww.example.com;

return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name example.com www.example.com;

ssl_certificate /usr/local/nginx/ssl/example.com.crt;
ssl_certificate_key /usr/local/nginx/ssl/example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

root /home/wwwroot/serverhome;
index index.htm index.html;

access_log /home/wwwlogs/example.com.log main;
}
```
Arumoh
2021-10-13 15:21:19 +08:00
80 端口不要走 HTTP2
huangzxx
2021-10-13 16:02:25 +08:00
server {
listen 80;
listen [::]:80;
server_name example.com
www.example.com;
return 301 https://$host$request_uri;
}
superrichman
2021-10-13 16:10:57 +08:00
error_page 497 https://$host$uri?$args;

利用 http 497 状态码 强制跳转到 https

(要啥 http,我嫌麻烦直接关掉了 80 端口
viamcc
2021-10-13 16:30:01 +08:00
@Arumoh 果然 80 去掉 http2 可以了,神奇。 谢谢老哥
amrnxcdt
2021-10-16 03:23:19 +08:00
@gengchun #4 楼主已经解决了但是还是纠正一下,$server_name 才是在 server_name 指令中配置的第一个域名。

server_name 指令指定多个域名的时候应该用$host 来获取正确的主机名,参考 8#和 10#的重写规则。

因为楼主多域名配置而且是第二个域名访问出现问题,我一开始认为是变量问题。

文档在 http://nginx.org/en/docs/http/ngx_http_core_module.html 的 Embedded Variables 节。

相关讨论 : https://serverfault.com/questions/706438/what-is-the-difference-between-nginx-variables-host-http-host-and-server-na
gengchun
2021-10-16 13:18:21 +08:00
@amrnxcdt 你是对的,这个我记错了。其实我一直用的 $http_host,因为很多时候,需要加上端口。这个就只有一个印象。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/807515

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX