本文主要是介绍Apache rewrite Url,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文主要介绍Apache环境下,如何使用mod_rewrite模块完成URL重写功能。
开启mod_rewrite模块
使用URL重写功能,需要安装mod_rewrite模块。使用phpinfo()函数,找到Apache
如果没有开启mod_rewrite,
LoadModule
打开http.conf,一般只要去掉之前的#号即可,重启Apache服务(所有对http.conf做的操作都需要对Apache进行重启)
Apache2内置了mod_rewirte,在配置虚拟主机的配置文件VirtualHost部分打开引擎:RewriteEngine
这句之后就可以使用重写语法了。
VirtualHost文件部分的Directory配置必须是:
<Directory
Options
AllowOverride
</
利用mod_rewrite重写URL主要使用两个基本的指令RewriteRule和RewriteCond。
RewriteRule指令
RewriteRule
在模式(Pattern)和替换(Substitution)中使用正则表达式来匹配相应的字符。
譬如有如下的URL:
http://www.example.com/display.php?country=USA
REQUEST_URI的值是“/country=USA
http://www.example.com/USA/California/San_Diego
一个最常用的正则就是(.*)。它含有两个元素:一是“点”,表示任
重定向的URL中要提取出“USA/California/San_Diego”,匹配模式正则表达式的原型是:
(.*)/(.*)/(.*)
以上正则,在{REQUEST_URI}中通过两个“/”的分割存储了三个值,为了解决我们具体问题,我们得加一点限制――毕竟,第一个和最后一个原子可以匹配任何字符。
开始,我们可以添加一些特殊的字符,比如表示正则“开始”或者“结束”,“^”字符表示正则的开始而“$”表示正则的结束。
^(.*)/(.*)/(.*)$
{REQUEST_URI}是以“/”开头。Apache
^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$
完整表示如下:
RewriteEngine
RewriteRule
RewriteRule使用$1到$9引用模式()中匹配的内容,称为反向引用。对于URL:
http://www.example.com/USA/California/San_Diego
$1=USA,$2=California,$3=San_Diego
RewriteRule选项
"redirect|R[=co
"proxy|P"
"forbidden|F"
"nocase|NC"
"next|N"
"last|L"
"noescape|NE"
RewriteRule
可以使‘/foo/zed’转向到一个安全的请求‘/bar?arg=P1=zed’.
"skip|S=N"
RewriteCond指令
RewriteCond
RewriteCond指令定义了一个规则的条件,即在一个RewriteRule指令之前有一个或多个RewriteCond指令。
RewriteCond也有反向引用,但和RewriteRule中用$N引用不同,它使用%N反向引用。
RewriteCond引用Apache变量%{
RewriteCond的条件模式(CondPattern)除了使用perl样式正则表达式,还有额外的规则:
1.
2.
3.
4.
5.
6.‘-l’
7.‘-F’
RewriteCond选项
‘nocase|NC’
‘ornext|OR’
RewriteCond
RewriteCond
RewriteCond
RewriteRule
如果不用这个标记,则必须使用三个
服务器变量
HTTP变量
HTTP_USER_AGENT,
HTTP_FORWARDED,
连结和请求的变量
REMOTE_ADDR,
REQUEST_METHOD,
服务器内部变量
DOCUMENT_ROOT,
SERVER_PORT,
系统变量
TIME_YEAR,
TIME_MIN,
mod_rewrite特殊值
API_VERSION,
URL重写举例
1.给子域名加www标记
RewriteCond
RewriteCond
RewriteRule
这个规则抓取二级域名的%1变量,如果不是以www开始,那么就加www,以前的域名以及{REQUEST_URI}会跟在其后。
2.去掉域名中的www标记
RewriteCond
RewriteRule
3.去掉www标记,但是保存子域名
RewriteCond
RewriteRule
这里,当匹配到1%变量以后,子域名才会在%2(内部原子)中抓取到,而我们需要的正是这个%1变量。
4.
一些站长不择手段的将你的图片盗链在他们网站上,耗费你的带宽。你可以加一下代码阻止这种行为。
RewriteCond
RewriteCond
RewriteRule
如果{HTTP_REFERER}值不为空,或者不是来自你自己的域名,这个规则用[F]FLAG阻止以gif|jpg|png
如果对这种盗链你是坚决鄙视的,你还可以改变图片,让访问盗链网站的用户知道该网站正在盗用你的图片。
RewriteCond
RewriteCond
RewriteRule
除了阻止图片盗链链接,以上规则将其盗链的图片全部替换成了你设置的图片。
你还可以阻止特定域名盗链你的图片:
RewriteCond
RewriteRule
这个规则将阻止域名黑名单上所有的图片链接请求。
当然以上这些规则都是以{HTTP_REFERER}获取域名为基础的,如果你想改用成IP地址,用{REMOTE_ADDR}就可以了。
5.如果文件不存在重定向到404页面
RewriteCond
RewriteCond
RewriteRule
-f匹配的是存在的文件名,-d匹配的存在的路径名
6.创建无文件后缀名链接
RewriteCond
RewriteRule
RewriteCond
RewriteRule
如果文件是以.php为后缀,这条规则将被执行。
7.强制使用HTTPS
RewriteCond
#RewriteCond
RewriteCond
RewriteRule
判断HTTPS服务可以判断安全端口(一般是443),也可以通过HTTPS变量。将example.com域名下所有url都强制使用https服务。
如果不判断域名,可以这样:
RewriteCond
RewriteRule
这里的$1前面有斜杠/,其实是匹配模式去掉了斜杠的原因,和上面效果是一样的。
这篇关于Apache rewrite Url的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!