rewrite重写规则
调整用户浏览的URL,看起来规范 合乎开发及产品人员的需求 为了让搜索引擎收录网站内容,让用户体验更好
企业会将动态URL地址伪装成静态地址提供服务 网站更换新域名后 例如,访问京东的360buy.com会跳转到jd.com
根据特殊的变量、目录、客户端信息进行跳转
URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中================================================================================ rewrite [flag]; 关键字 正则
替代内容 flag标记 关键字:其中关键字error_log不能改变 正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement flag标记:rewrite支持的flag标记
flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break
#本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
例子:
rewrite ^/(.*) http://www.czlun.com/$1 permanent;
说明:
rewrite为固定关键字,表示开始进行rewrite匹配规则
regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址
replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。
flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(emporarily Moved )
ps:这里也顺带记住了两个比较相近的英语单词(permanently、temporarily),嘻哈!
301与302详解:
详细来说,
301和302状态码都表示重定向,
就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,
这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们的不同在于:
301:表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),
搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302:表示旧地址A的资源还在(仍然可以访问),
这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
================================================================================
[kiosk@foundation0 Packages]$ curl -I taobao.com
HTTP/1.1 302 Found
Server: Tengine
Date: Sat, 13 Apr 2019 06:09:35 GMT
Content-Type: text/html
Content-Length: 258
Connection: keep-alive
Location: http://www.taobao.com/
[kiosk@foundation0 Packages]$ curl -I www.taobao.com
HTTP/1.1 302 Found
Server: Tengine
Date: Sat, 13 Apr 2019 06:09:42 GMT
Content-Type: text/html
Content-Length: 258
Connection: keep-alive
Location: https://www.taobao.com/
Set-Cookie: thw=cn; Path=/; Domain=.taobao.com; Expires=Sun, 12-Apr-20 06:09:42 GMT;
Strict-Transport-Security: max-age=31536000
访问淘宝,发现淘宝做了重定向(注意:需要连接无线)
那如何自动实现https加密呢?
www.westos.org(实质:http://www.westos.org) 自动跳转到 https://www.westos.org 即:http ---> https
###########################################
. : 匹配除换行符以外的任意字符
? : 重复0次或1次 例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}"
+ : 重复1次或更多次 如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”
* : 重复0次或更多次 #如“ol*”能匹配“o”及“ol”、“oll”
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的结束
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
###########################################
location 是在 server 块中配置。可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。
vim nginx.conf
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
`
location / {
root /web;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.westos.org;
rewrite ^/(.*)$ https://www.westos.org/$1; ##$1表示用户在这里输入的内容保留,只会重定向$1前面的
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent; 永久重定向(可以缓存,临时的不允许缓存)
}
permanent 返回301永久重定向
[kiosk@foundation0 Packages]$ curl -I www.westos.org
HTTP/1.1 301 Moved Permanently
Server: nginx/1.15.9
Date: Sat, 13 Apr 2019 06:13:13 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://www.westos.org/
注意:此处为302临时
[kiosk@foundation0 Packages]$ curl -I www.westos.org/index.html #$1
HTTP/1.1 301 Moved Permanently
Server: nginx/1.15.9
Date: Sat, 13 Apr 2019 06:16:02 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://www.westos.org/index.html
[kiosk@foundation0 Packages]$ curl -I www.westos.org/test.html #$1
HTTP/1.1 301 Moved Permanently
Server: nginx/1.15.9
Date: Sat, 13 Apr 2019 06:16:35 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://www.westos.org/test.html
############################################################################
#再加一台虚拟主机
server {
listen 443 ssl;
server_name www.westos.org bbs.westos.org;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#location / {
# root /web;
# index index.html index.htm;
#}
location / {
root /bbs;
index index.html;
}
}
#重定向2
server {
listen 80;
server_name www.westos.org;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
rewrite ^/bbs$ https://bbs.westos.org/index.html permanent; #表示访问www.westos.org并且以bbs结尾的,都定向到https://bbs.westos.org,而访问的页面就是location中/bbs/index.html
mkdir /bbs
vim /bbs/index.html
<h1>bbs.westos.org</h1>
nginx -s reload
尝试访问是否正常
curl -I www.westos.org/bbs
[root@foundation0 ~]# curl bbs.westos.org
<h1>bbs.westos.org</h1>
[root@foundation0 ~]# curl -I www.westos.org/bbs
HTTP/1.1 301 Moved Permanently
Server: nginx/1.15.9
Date: Sat, 13 Apr 2019 06:32:00 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://bbs.westos.org/index.html
[root@foundation0 ~]# curl -I www.westos.org/bbs/index.html
HTTP/1.1 404 Not Found
Server: nginx/1.15.9
Date: Sat, 13 Apr 2019 06:32:05 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
重定向3:多次重定向
server {
listen 80;
server_name bbs.westos.org;
location / {
root /bbs;
index index.html;
}
}
server {
listen 80;
server_name www.westos.org;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
rewrite ^/bbs$ http://bbs.westos.org permanent;
rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
#浏览器测试:是bbs.westos.org对应的根目录
'先匹配第一条重写规则定向到bbs.westos.org,然后再定向到下一条规则'
#重定向4:整合
server {
listen 80;
server_name www.westos.org bbs.westos.org;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
#rewrite ^/bbs$ http://bbs.westos.org permanent;
#rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
if ($host = "bbs.westos.org") { #$host : 请求主机头字段,否则为服务器名称
rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
}
location / {
root /web;
index index.html;
}
}
nginx -s reload
cd /web/
cp -r /bbs/ .
测试:curl -I bbs.westos.org
nginx配置防盗链
1.先配置盗链,server1上的vim.jpg被盗链,server2是盗链者
server1上不需要改变什么配置,只用把www.westos.org这个域名保留
在server2上修改虚拟主机配置:
server {
listen 80;
server_name daolian.westos.org;
charset utf-8; #不加这个参数网页上看到的汉字是乱码
location / {
root /web;
index index.html;
}
}
编写配文件 访问daolian.westos.org就去/web/index.html
vim /web/index.html
<html>
<body>
<br>盗链图片</br>
<img src="http://www.westos.org/vim.jpg">
</body>
</html>
注意:此处盗链的是server1 /web/vim.jpg图片
在物理机和各节点都配置解析
172.25.136.2 daolian.westos.org
物理机:
server1上需要把vim.jpg资源放到/web目录
server:nginx.conf
server {
listen 80;
server_name www.westos.org bbs.westos.org;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
#rewrite ^/bbs$ http://bbs.westos.org/index.html permanent;
#rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
#if ($host = "bbs.westos.org") {
# rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
# }
#
location / {
root /web;
index index.html;
}
}
访问: http://daolian.westos.org 发现,访问到了server1上的vim.jpg资源,这就是盗链
server2即使不用添加本地解析也可以实现盗链,
因此我们也可以设置防防盗链
#配置防盗链
server1上修改配置:
vim nginx.conf
server {
listen 80;
server_name www.westos.org ;
#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
#rewrite ^/bbs$ http://bbs.westos.org permanent;
#rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
#if ($host = "bbs.westos.org") {
# rewrite ^/(.*)$ http://www.westos.org/$1 permanent;
#}
location / {
root /web;
index index.html;
}
location ~* \.(gif|jpg|png|jpeg)$ {
root /web;
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
return 403;
}
}
}
当访问域名为www.westos.org时正常访问,否则返回一个不可见小图标
此时发现盗链失败
#再优化防盗链配置,添加重定向规则
vim nginx.conf
location ~* \.(gif|jpg|png|jpeg)$ {
root /web;
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
rewrite ^/(.*)$ http://bbs.westos.org/daolian.jpg;
}
}
}
server {
listen 80;
server_name bbs.westos.org;
location / {
root /bbs;
index index.html;
}
}
当盗链访问server1时,重定向到另外一张图片,警告它是盗链(也可以是给自己打广告的图片^_^)