URL重写这东西在工作中用了很多次了,但每次都忘记了要记得把知道的积累下来。
哎,要么认为没必要,要么就是没时间?!
一、Apache 篇
官方地址:http://man.chinaunix.net/newsoft/ApacheManual/mod/mod_rewrite.html
1.htaccess基本语法介绍
服务器有配置文件不可能由我们来改,所以大多情况下要在网站的根目录下建一个.htaccess文件。
#设置重写的根目录
RewriteBase /#开启重写引擎RewriteEngine on
#RewriteCond 匹配所有符合条件的请求
#如果不是文件、不是目录
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d#执行RewriteRule规则体#如果命中了这条,则不执行下面的所有重写规则RewriteRule ^/?front/ /front/index.html [L]#下面两条命中,都会被执行RewriteRule ^/?front/abc /background/abc.htmlRewriteRule ^/?front/edf /background/edf.html#如果不是文件、不是目录RewriteCond %{REQUEST_FILENAME} !-f [NC]RewriteCond %{REQUEST_FILENAME} !-d [NC]#执行RewriteRule规则体RewriteRule . index.php [L]
其中RewriteCond 就是程序语言中的 if 逻辑, RewriteRule 代表的就是代码体。[L] 代表的是break 。[NC] 标签表示不区分大小写
逻辑类似下图:
2、Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。4) P(force proxy) 强制使用代理转发。5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。6) N(next round) 重新从第一条规则开始运行重写过程。7) C(chained with next rule) 与下一条规则关联如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。8) T=MIME-type(force MIME type) 强制MIME类型9) NS (used only if no internal sub-request) 只用于不是内部子请求10) NC(no case) 不区分大小写11) QSA(query string append) 追加请求字符串12) NE(no URI escaping of output) 不在输出转义特殊字符例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo13) PT(pass through to next handler) 传递给下一个处理例如:14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量 3、Apache 内置变量说明http://blog.sina.com.cn/s/blog_6bad64c20101a3n9.html
4、Apache 使用示例
http://www.jb51.net/article/47907.htm
二、Nginx 篇
官方地址:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
在nginx的[ /data/servers/nginx/conf/domains/www.demo.com.conf ]配置中添加如下内容,使支持.htaccess_nginx文件。
include /home/wwwroot/www.demo.com/.htaccess_nginx;
1.htaccess_nginx 基本语法介绍
.htaccess_nginx 文件内容
if ($request_filename ~ "^.*.(forum\.php).*$"){ rewrite ^/forum.php/(.*)$ /forum.php?s=/$1 last; break;}#并且条件set $flag 0;if (!-e $request_filename) { set $flag "${flag}1";}if ($request_filename ~ "^.*.(/front/).*$") { set $flag "${flag}2";}if ($flag = "012") { rewrite ^/front/(.*)$ /front/index.html last; break;}if (!-e $request_filename){ rewrite ^/(.*)$ /index.php last;}
详细见:http://www.nginx.cn/216.html
2、Nginx rewrite规则重写的标志一览
1) last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
2) break 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。3) redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向4) permant 返回301永久重定向3、Nginx 内置变量说明
http://www.cnphp.info/nginx-embedded-variables-lasted-version.html
4、Nginx 使用示例
http://blog.csdn.net/wave_1102/article/details/46483897
三、Apache 和 Nginx 对比
两种服务器实现的同一效果的URL重写逻辑对比图:
相同点:
都使用通用的正则语法做URL匹配。
不同点:
ngingx 无法使用并且语句。需另辟蹊径,使用set 语句来处理。
对应的标签和语法关键字不同。
ps:
http://man.chinaunix.net/newsoft/ApacheManual/mod/mod_rewrite.html
http://www.runoob.com/regexp/regexp-syntax.html
http://www.cnblogs.com/yuanzai12345/p/5976090.html