1、301 和 302 区别:
301和302第一次请求都一样, 第一次请求旧域名,请求里有host信息,请求的域名信息;旧域名响应信息,包含跳转信息,应该访问新域名;客户端再发起新的请求,访问新域名,新域名响应要访问的页面。
301 第二次, 只通过一次请求就访问到新域名,相当于浏览器直接告诉客户端, 直接访问新域名,而302 还会先访问旧域名,302 依旧是发送两次请求。
301 和302 浏览器域名 会发生改变。
2、return
也是跳转;效果上用户体验一样。
位置:server、location、if
www.jd.com/oldboy.html 匹配上了---> return 301 www.jx.com/oldboy.html
www.jd.com/oldboy.html 匹配上了---> return 200 ‘ok’ # 页面显示ok
3、页面跳转实践操作
3.1、last 和 break 区别示例
server {
listen 80;
server_name rewrite.oldboy.com;
root /html;
index index.html;
location ~ ^/break/ {
rewrite ^/break/ /test/ break;
}
location ~ ^/last/ {
rewrite ^/last/ /test/ last;
}
location /test/ {
default_type application/json;
return 200 'ok';
}
}
break:一旦跳转完毕,默认停止后续操作(没有相应信息) 不会再地址栏显示跳转页面地址
last: 一旦跳转完毕,会继续访问页面配置信息
last 和 break 不会改变浏览器 显示的url 地址。
3.2、root 和alias 区别:
location ^~ /t/ {
root /www/root/html/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
alias实例:
location ^~ /t/ {
alias /www/root/html/new_t/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
注意:
1. 使用alias时,目录名后面一定要加"/"。
3. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
4. alias只能位于location块中。(root可以不放在location中)
3.3、跳转示例
# uri 跳转示例
用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
#http://www.oldboy.com/course-11-22-33.html ==> http://www.oldboy.com/course/11/22/33/course_33.html
跳转目的,不要让用户得知企业站点目录结构
第一个里程 准备真实的访问路径
[root@web03 ~]# mkdir /html/course/11/22/33/ -p
[root@web03 ~]# echo "Curl docs.etiantian.org" > /html/course/11/22/33/course_33.html
第二个里程 Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
root /code;
index index.html;
location / {
#灵活rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
第三个里程 重启Nginx服务
[root@web03 ~]# systemctl restart nginx
说明:last break 做跳转不会显示跳转的地址信息
# url 跳转示例
curl -Lv -H host:rewrite.edu.com 10.0.0.7 # 不用hosts解析了
-L 跳转之后,继续追踪显示继续
错误示例:
正确方法一:中断连续跳转
正确方法二:if判断访问的域名
[root@nginx_web01 conf.d]# cat rewrite.conf
server {
listen 80;
server_name 10.0.0.151 www.houbinglei.com;
location / {
index new/index.html;
if ($http_host ~* 10.0.0.151) {
rewrite ^/(.*) http://www.houbinglei.com/$1 redirect;
}
}
}
4、http跳转https
4.1 部署https 网站
第一个历程:环境准备工作
安装nginx程序时,需要开启ssl模块功能() --with-http_ssl_module
第二个历程:配置文件中加载ssl配置信息
# 官网链接 http://nginx.org/en/docs/http/ngx_http_ssl_module.html
server {
listen 443 ssl;
server_name rewrite.oldboy.com;
ssl_certificate /etc/nginx/server.crt; # 相当于公钥
ssl_certificate_key /etc/nginx/server.key; # 相当于私钥
}
当访问京东时,京东会返回给浏览器一个证书.crt (ca对私钥签名生成),下次访问,浏览器拿着证书 跟 京东服务器的私钥进行验证。
# ssh 密钥对原理
ssh密钥对登录的基本思路是:要登录谁,就把公钥放到谁身上,就可以授权登录谁。
第三个历程: 创建私钥和证书
先有私钥:
openssl genrsa -idea -out server.key 2048
私钥密码
创建证书:
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
-days 36500 --- 设置证书时效
-x509 --- 设置证书文件信息格式
-sha256 --- 证书数据加密方式
-nodes -newkey --- 去掉密码信息
rsa:2048 --- 识别私钥加密信息
-keyout --- 读取私钥文件
-out --- 输出一个证书
第四个历程:重启nginx服务,进行测试
第五个历程:实现http跳转为HTTPs
[root@web01 nginx]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rewrite.oldboy.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name rewrite.oldboy.com;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
location / {
root /html;
index index.html index.htm;
}
}
## scheme 示例
# rewrite ^(.*) $scheme://rewrite.oldboyedu.com$request_uri redirect;
# https://rewrite.oldboy.com/oldboy.jpg ---> https://rewrite.oldboyedu.com/oldboy.jpg
Rewrite常用内置变量,在匹配过程中可以引用一些Nginx的全局变量
$server_name 当前用户请求的域名
$request_filename 当前请求的文件路径名(带网站的主目录/html/images/test.jpg)
$request_uri 当前请求的文件路径名(不带网站的主目录/images/test.jpg)
$scheme 用的协议,比如http或者https
5、 nginx 配置文件加载顺序
配置文件匹配的优先顺序
当在/etc/nginx/conf.d/目录下有多个Nginx配置文件,且监听的端口号相同时,会优先选择配置了匹配的server_name且值不为localhost的配置文件;
如果server_name只有为localhost的配置文件和没有配置server_name的配置文件,则会选择localhost的配置文件;
如果监听的端口号及server_name配置的值都一样,则优先选择该目录下第一个配置文件。