做新闻类网站还有市场吗,0453牡丹江信息网官网,火速网站建设,网页制作与网站建设》在线作业 答案十二 nginx 地址重写 rewrite
1 什么是Rewrite
Rewrite对称URL Rewrite#xff0c;即URL重写#xff0c;就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化#xff0c;是将动态页面显示为静态页面方式的一种技术。比如 http://www.123.com…十二 nginx 地址重写 rewrite
1 什么是Rewrite
Rewrite对称URL Rewrite即URL重写就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化是将动态页面显示为静态页面方式的一种技术。比如 http://www.123.com/news/index.php?id123 使用URLRewrite 转换后可以显示为 http://www.123 .com/news/123.html对于追求完美主义的网站设计师就算是网页的地址也希望看起来尽量简洁明快。 理论上搜索引擎更喜欢静态页面形式的网页搜索引擎对静态页面的评分一般要高于动态页面。所以UrlRewrite可以让我们网站的网页更容易被搜索引擎所收录。从安全角度上讲如果在URL中暴露太多的参数无疑会造成一定量的信息泄漏可能会被一些黑客 利用对你的系统造成一定的破坏所以静态化的URL地址可以给我们带来更高的安全性。实现网站地址跳转例如用户访问360buy.com将其跳转到jd.com。例如当用户访问tianyun.com的 80端口时将其跳转到443端口。
2 Rewrite 相关指令
Nginx Rewrite 相关指令有 if 、rewrite、set、return
2.1、if 语句
应用环境
serverlocation语法
if (condition) { … }
if 可以支持如下条件判断匹配符号
~ 正则匹配 (区分大小写)
~* 正则匹配 (不区分大小写)
!~ 正则不匹配 (区分大小写)
!~* 正则不匹配 (不区分大小写)
-f 和!-f 用来判断是否存在文件
-d 和!-d 用来判断是否存在目录
-e 和!-e 用来判断是否存在文件或目录
-x 和!-x 用来判断文件是否可执行在匹配过程中可以引用一些Nginx的全局变量
$args 请求中的参数;
$document_root 针对当前请求的根路径设置值;
$host 请求信息中的Host如果请求中没有Host行则等于设置的服务器名;
$limit_rate 对连接速率的限制;
$request_method 请求的方法比如GET、POST等;
$remote_addr 客户端地址;
$remote_port 客户端端口号;
$remote_user 客户端用户名认证用;
$request_filename 当前请求的文件路径名带网站的主目录/usr/local/nginx/html/images/a.jpg
$request_uri 当前请求的文件路径名不带网站的主目录/images/a.jpg
$query_string 与$args相同;
$scheme 用的协议比如http或者是https
$server_protocol 请求的协议版本HTTP/1.0或HTTP/1.1;
$server_addr 服务器地址如果没有用listen指明服务器地址使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name 请求到达的服务器名;
$document_uri 与$uri一样URI地址;
$server_port 请求到达的服务器端口号;2.2、Rewrite flag
rewrite 指令根据表达式来重定向URI或者修改字符串。
可以应用于server,location, if环境下每行rewrite指令最后跟一个flag标记支持的flag标记有
last 相当于Apache里的[L]标记表示完成rewrite。默认为last。
break 本条规则匹配完成后终止匹配不再匹配后面的规则
redirect 返回302临时重定向浏览器地址会显示跳转后的URL地址
permanent 返回301永久重定向浏览器地址会显示跳转后URL地址 redirect 和 permanent 区别则是返回的不同方式的重定向对于客户端来说一般状态下是没有区别的。而对于搜索引擎相对来说301的重定向更加友好如果我们把一个地址采用301跳转方式跳转的话搜索引擎会把老地址的相关信息带到新地址同时在搜索引擎索引库中彻底废弃掉原先的老地址。使用302重定向时搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观然后决定显示哪个如果它觉的跳转前的URL更好的话也许地址栏不会更改那么很有可能出现URL劫持的现像。在做URI重写时有时会发现URI中含有相关参数如果需要将这些参数保存下来并且在重写过程中重新引用可以用到 () 和 $N 的方式来解决。
2.3、Rewrite匹配参考示例
# 本地解析host文件
例1
# http://www.testpm.com/a/1.html http://www.testpm.com/b/2.htmllocation /a {root /html;index 1.html index.htm;rewrite .* /b/2.html permanent;}location /b {root /html;index 2.html index.htm;}例2
# http://www.testpm.com/2019/a/1.html http://www.testpm.com/2018/a/1.htmllocation /2019/a {root /var/www/html;index 1.html index.hml;rewrite ^/2019/(.*)$ /2018/$1 permanent;}location /2018/a {root /var/www/html;index 1.html index.htl;}例3
# http://www.lanfw1.com/a/1.html http://jd.comlocation /a {root /html;if ($host ~* www.qf.com ) {rewrite .* http://jd.com permanent;}}例4
# http://www.lanfw1.com/a/1.html http://jd.com/a/1.html
location /a {root /html;if ( $host ~* testpm.com ){rewrite .* http://jd.com$request_uri permanent;}}例5: 在访问目录后添加/ (如果目录后已有/则不加/)
# http://www.lanfw1.com/a/b/c
# $1: /a/b/
# $2: c
# http://$host$1$2$3/
location /a/b/c {if (-d $request_filename) {rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;}}例6
# http://www.lanfw.com/login/lanfw.html http://www.lanfw.com/reg/login.html?userlanfwlocation /login {root /usr/share/nginx/html;rewrite ^/login/(.*)\.html$ http://$host/reg/login.html?user$1;}location /reg {root /usr/share/nginx/html;index login.html;}例7
#http://www.lanfw.com/qf/11-22-33/1.html http://www.lanfw.com/qf/11/22/33/1.html
location /qf {rewrite ^/qf/([0-9])-([0-9])-([0-9])(.*)$ /qf/$1/$2/$3$4 permanent;}location /qf/11/22/33 {root /html;index 1.html;}2.4、set 指令
set 指令是用于定义一个变量并且赋值
应用环境:
server,location,if应用示例
例8
#http://alice.testpm.com http://www.testpm.com/alice
#http://jack.testpm.com http://www.testpm.com/jack[rootnginx-server conf.d]# cd /usr/share/nginx/html/
[rootnginx-server html]# mkdir jack alice
[rootnginx-server html]# echo jack.. jack/index.html
[rootnginx-server html]# echo alice.. alice/index.htmla. DNS实现泛解析
* IN A 网站IP
# 或者本地解析域名host文件
10.0.105.202 www.testpm.com
10.0.105.202 alice.testpm.com
10.0.105.202 jack.testpm.com# 编辑配置文件:
server {listen 80;server_name www.testpm.com;location / {root /usr/share/nginx/html;index index.html index.htm;if ( $host ~* ^www.testpm.com$) {break;}if ( $host ~* ^(.*)\.testpm\.com$ ) {set $user $1;rewrite .* http://www.testpm.com/$user permanent;}}location /jack {root /usr/share/nginx/html;index index.html index.hml;}location /alice {root /usr/share/nginx/html;index index.html index.hml;}
}2.5、return 指令
return 指令用于返回状态码给客户端
server,location,if应用示例:
例9如果访问的.sh结尾的文件则返回403操作拒绝错误
server {listen 80;server_name www.testpm.cn;#access_log /var/log/nginx/http_access.log main;location / {root /usr/share/nginx/html;index index.html index.htm;}location ~* \.sh$ {return 403;}
}例10
80 443 80转443端口
server {listen 80;server_name www.testpm.cn;access_log /var/log/nginx/http_access.log main;return 301 https://www.testpm.cn$request_uri;
}server {listen 443 ssl;server_name www.testpm.cn;access_log /var/log/nginx/https_access.log main;#ssl on;ssl_certificate /etc/nginx/cert/2447549_www.testpm.cn.pem;ssl_certificate_key /etc/nginx/cert/2447549_www.testpm.cn.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ALL:!ADH:!EXPORT56:RC4RSA:HIGH:MEDIUM:LOW:SSLv2:EXP;ssl_prefer_server_ciphers on;location / {root /usr/share/nginx/html;index index.html index.htm;}
}[rootnginx-server ~]# curl -I http://www.testpm.cn
HTTP/1.1 301 Moved Permanently
Server: nginx/1.16.0
Date: Wed, 03 Jul 2019 13:52:30 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://www.testpm.cn/3 last break详解 [rootlocalhost test]# cat /etc/nginx/conf.d/last_break.conf
server {listen 80;server_name localhost;access_log /var/log/nginx/last.access.log main;location / {root /usr/share/nginx/html;index index.html index.htm;}location /break/ {root /usr/share/nginx/html;rewrite .* /test/break.html break;}location /last/ {root /usr/share/nginx/html;rewrite .* /test/last.html last;}location /test/ {root /usr/share/nginx/html;rewrite .* /test/test.html break;}}
[rootlocalhost conf.d]# cd /usr/share/nginx/html/
[rootlocalhost html]# mkdir test
[rootlocalhost html]# echo last test/last.html
[rootlocalhost html]# echo break test/break.html
[rootlocalhost html]# echo test test/test.htmlhttp://10.0.105.196/break/break.html
http://10.0.105.196/last/last.html 注意
last 标记在本条 rewrite 规则执行完后会对其所在的 server { … } 标签重新发起请求;break 标记则在本条规则匹配完成后停止匹配不再做后续的匹配使用 alias 指令时必须使用 last使用 proxy_pass 指令时,则必须使用break。
4 Nginx 的 https ( rewrite )
server {listen 80;server_name *.vip9999.top vip9999.top;if ($host ~* ^www.vip9999.top$|^vip9999.top$ ) {return 301 https://www.vip9999.top$request_uri;}if ($host ~* ^(.*).vip9999.top$ ) {set $user $1;return 301 https://www.vip9999.top/$user;}}# Settings for a TLS enabled server.server {listen 443 ssl;server_name www.vip9999.top;location / {root /usr/share/nginx/html;index index.php index.html;}#pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000location ~ \.php$ {root /usr/share/nginx/html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}ssl on;ssl_certificate cert/214025315060640.pem;ssl_certificate_key cert/214025315060640.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 10m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;}5 Apache 的 https ( rewrite )
[rootlocalhost ~]# yum -y install httpd mod_ssl
[rootlocalhost ~]# vim /etc/httpd/conf.d/vip9999.conf例4