Nginx的主配置文件是 nginx.conf ,在阿里云服务器中,它一般位于 /etc/nginx 目录之下,为了避免频繁改动主配置文件,笔者屏蔽掉了主配置文件中的监听80端口的部分(nginx对443端口的监听默认状态为被注释),通过在 /etc/nginx 下的 conf.d 文件夹中新建一个后缀为 .conf 的文件,来实现对配置的增删。
站点通过下面的语句设置了强制 https 访问,当用户以 http 开头的网址访问时,会被强制 301 跳转到 https 页面,但是测试时发现,不仅是通过域名访问会被跳转,通过 ip 访问服务器时,也会被自动跳转到”https://www.biib.top” 。
server {
listen 80;
server_name www.biib.top;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
百度搜索了一下成因,感觉类似于这篇文章所提及的
《nginx配置文件nginx.conf之server及server_name的意义详解》,
通过其他ip也能请求到nginx,但是匹配不到相应的server,这个时候就会使用第一个server。正愁没法屏蔽通过ip地址访问,这样误打误撞也算是解决了一半了。
但当用户通过 https 的方式访问 ip 地址时,80 端口的规则就不再起作用了,尝试为 ip 单独配置一个 443 端口的,发现 443 端口必须填写证书路径,一想自己也没有 ip 证书啊,只有一套域名的,遂作罢,后续看到有文章说,证书语句必须要有,但证书名称可随意填写,假证也行呗……
虽然没有坚持实践出真知,但还是找到了替代的方法,即在原 443 的server中加入了一条判断语句:
server {
listen 443 ssl;
server_name www.biib.top;
root /usr/share/nginx/html/wordpress;
#判断部分开始
if ($host != 'www.biib.top'){
#rewrite ^(.*)$ https://${server_name}$1 permanent;
}
#判断部分结尾
ssl_certificate /etc/pki/nginx/biib.top.pem;
ssl_certificate_key /etc/pki/nginx/biib.top.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
这样服务器会判断来访用户是否通过www.biib.top访问,不符合的同样会被跳转到”https://www.biib.top”。