新站SEO的朋友注意了,经本人测试,使用404强制跳转会导致页面无收录,因为爬虫不会跳转,比如访问地址https://justmyfreedom.com/会直接报404,而不会去管后面跳转的地址,直接显示无页面.NGINX强制使用https访问(http跳转到https)
一.需求简介
基于nginx搭建了一个https访问的虚拟主机,监听的域名是justmyfreedom.com,但是很多用户不清楚https和http的区别,会很容易敲成https://justmyfreedom.com这时会报出404错误,所以我需要做基于justmyfreedom.com域名的http向https的强制跳转
二.http跳转到https配置方式
进过网上查询,总结了一下三种方式,可以根据需求进行设置.
1. nginx的rewrite方法
这应该是大家最容易想到的方法.
第一步:打开NGINX的配置文件(通常是位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf)。
第二步:在HTTP server块中,找到对应的server段落。在该段落中,添加以下代码以将所有HTTP请求重定向到HTTPS:
server {
listen 80;
server_name example.com; // 替换为你的域名
# HTTP重定向到HTTPS
rewrite ^(.*)$ https://$host$1 permanent;
}
这将使用rewrite指令将所有HTTP请求重定向到相应的HTTPS URL。
第三步:在同一个配置文件中,找到HTTPS server块,该块用于处理HTTPS请求。确保以下配置选项正确设置:
server {
listen 443 ssl;
server_name example.com; // 替换为你的域名
# 其他SSL/TLS配置项
ssl_certificate /path/to/ssl_certificate.crt; // 替换为你的SSL证书路径
ssl_certificate_key /path/to/private_key.key; // 替换为你的私钥路径
# 其他配置项
}
确保在listen指令中使用了ssl关键字,以便监听HTTPS流量。
第四步:保存并关闭配置文件。重新加载NGINX配置,以使更改生效。可以通过运行以下命令来实现:
sudo service nginx reload
大功告成!
2. nginx的497状态码
error code 497
497 - normal request was sent to HTTPS
解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码,利用error_page命令将497状态码的链接重定向到https://justmyfreedom.com/这个域名上
可以按照以下步骤进行配置:
第一步:打开NGINX的配置文件(通常是位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf)。
第二步:在HTTP server块中,找到对应的server段落。在该段落中,添加以下代码以将所有HTTP请求重定向到HTTPS,并返回497状态码:
server {
listen 80;
server_name example.com; // 替换为你的域名
# HTTP重定向到HTTPS,并返回497状态码
return 497;
}
这将使用return指令将所有HTTP请求重定向到相应的HTTPS URL,并返回497状态码表示重定向。
第三步:在同一个配置文件中,找到HTTPS server块,该块用于处理HTTPS请求。确保以下配置选项正确设置:
server {
listen 443 ssl;
server_name example.com; // 替换为你的域名
# 其他SSL/TLS配置项
ssl_certificate /path/to/ssl_certificate.crt; // 替换为你的SSL证书路径
ssl_certificate_key /path/to/private_key.key; // 替换为你的私钥路径
# 其他配置项
}
确保在listen指令中使用了ssl关键字,以便监听HTTPS流量。
第四步:保存并关闭配置文件。重新加载NGINX配置,以使更改生效。可以通过运行以下命令来实现:
sudo service nginx reload
大功告成!
3. index.html刷新网页
上述两种方法均会耗费服务器的资源,我们可以查看其他网站是如何实现http跳转到https的跳转.测试在浏览器中输入将baidu.com,发现很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com因此我们可以基于http://justmyfreedom.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转
可以参照以下步骤设置:
第一步:都是打开NGINX的配置文件(通常是位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf)。
第二步:在HTTP server块中,找到对应的server段落。在该段落中,添加以下代码以将所有HTTP请求重定向到HTTPS:
server {
listen 80;
server_name example.com; // 替换为你的域名
# HTTP重定向到HTTPS
return 301 https://$host$request_uri;
}
这将使用return指令将所有HTTP请求重定向到相应的HTTPS URL。
第三步:在同一个配置文件中,找到HTTPS server块,该块用于处理HTTPS请求。确保以下配置选项正确设置:
server {
listen 443 ssl;
server_name example.com; // 替换为你的域名
# 其他SSL/TLS配置项
ssl_certificate /path/to/ssl_certificate.crt; // 替换为你的SSL证书路径
ssl_certificate_key /path/to/private_key.key; // 替换为你的私钥路径
# 其他配置项
location / {
try_files $uri $uri/ /index.html;
}
}
在HTTPS server块的location /段落中,使用try_files指令将请求重定向到index.html文件。这将确保在刷新页面时保持HTTPS连接。
第四步:保存并关闭配置文件。重新加载NGINX配置,以使更改生效。可以通过运行以下命令来实现:
sudo service nginx reload
4. 使用 if 指令
和以上方式相同,打开配置文件,修改:
server {
listen 80;
server_name example.com; // 替换为你的域名
if ($http_x_forwarded_proto != "https") {
return 301 https://$host$request_uri;
}
# 其他配置项
}
在上面配置中,使用了 $http_x_forwarded_proto 变量来判断请求是否通过 HTTP 而不是 HTTPS。如果条件成立,即请求不是通过 HTTPS 访问的,则将其重定向到相应的 HTTPS URL。
请注意,使用 if 指令需要谨慎,因为它可能会引入一些不可预测的行为,并且在高负载环境下可能会影响性能。建议使用其他方式(如重定向或 rewrite)来实现强制使用 HTTPS 访问,以获得更可靠和高效的结果。
在配置完成后,保存并重新加载 NGINX 配置。
注意:
以上步骤做好之后,当用户访问的网站时,NGINX将使用rewrite指令将HTTP请求重定向到相应的HTTPS URL。确保将"example.com"替换为自己的域名,并将SSL证书和私钥的路径设置为正确的值。
上述几种方法均可以实现基于nginx强制将http请求跳转到https请求,大家可以评价一下优劣或者根据实际需求进行选择。参考时一定要结合自己的实际情况,我很多配置基于项目安全考虑做了删减.