学php也有3年了,一直对url重写不是很了解,本学用到的话都是百度一下,再复制作简单修改,一些变量的参数都不太了解什么意思,难得今天有时间,做个笔记吧!
1)可用的一些系统变量,在重写条件和重写规则里都可以使用,格式为 %{name_of_variable}
HTTP headers: | connection & request: | |
---|---|---|
HTTP_ACCEPT HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_REFERER HTTP_USER_AGENT |
AUTH_TYPE CONN_REMOTE_ADDR CONTEXT_PREFIX CONTEXT_DOCUMENT_ROOT IPV6 PATH_INFO QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_IDENT REMOTE_PORT REMOTE_USER REQUEST_METHOD SCRIPT_FILENAME |
|
server internals: | date and time: | specials: |
DOCUMENT_ROOT SCRIPT_GROUP SCRIPT_USER SERVER_ADDR SERVER_ADMIN SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |
API_VERSION CONN_REMOTE_ADDR HTTPS IS_SUBREQ REMOTE_ADDR REQUEST_FILENAME REQUEST_SCHEME REQUEST_URI THE_REQUEST |
使用示例:
RewriteCond %{HTTP_REFERER} !abc.com [NC] RewriteCond %{REQUEST_URI} !logo.png [NC] RewriteRule .(jpg|png|gif|jpeg)$ http://www.abc.com/logo.png [R,NC,L]
PS:具体每个变量是什么意思就不说了,看变量名一般也知道是什么意思,实在不知道就自己再查吧
2)参数变量(只列出常用的几个,其他的请看 这里)
-d 是否一个目录
-f 是否一个文件
-U 是否一条有效的链接
这个比较常用来做伪静态时,判断访问链接是否一个真实目录或一个真实文件,不对它们进行重写(!是不等于的意思)
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
3)比较运算符(用于重写条件 RewriteCond)
字符串比较
= 等于
< 小于
> 大于
<= 小于等于
>= 大于等于
整数比较
-eq 等于(equal)
-ge 大于等于(greater or equal)
-gt 大于(greater than)
-le 小于等于(less or equal)
-lt 小于(less than)
-ne 不等于(not equal)
4)RewriteBase 重写的根目录
默认重写是从根目录 / 开始的,但如果你的web目录是在二维目录里的,例如 /myapp/ 里的,这时候你要使用 urlrewrite的话是这样的
RewriteRule "^/myapp/index.html$" "/myapp/index.php"
这样的话,是不是会很烦??这时候你就可以用RewriteBase了
RewriteBase "/myapp/"
RewriteRule "^index.html$" "index.php"
5)RewriteRule 后面的标识(flags)(同时只列出几个常用的,其他的请看 这里)
[QSA] 保留未重写之前的链接的查询参数
RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]
使用 [QSA] 标识, 一个类似 /pages/123?one=two 这样的请求,会被重写成 /page.php?page=123&one=two 这样,如果没有 [QSA] 标识, 一样的请求,将会被重写成 /page.php?page=123
[PT] 使用这个标识,会让系统遇到一些以pathinfo格式分隔的url,不当成一个目录路径来处理
例如:/home/article/detail/id/1.html 默认地,url用/分隔的,是会被认为是目录来处理的(home目录下的article目录下的detail目录下的id目录下的1.html文件) 使用[PT]标识,就是告诉系统,这就是条字符串,不是目录,不要去找目录
[L] 匹配的最后一条规则,意思就是如果匹配了这一条规则,就不用比较这一条规则后的规则是否匹配了,直接停掉就可以了
[NC] 匹配时忽略大小写
[R] 重定向,url防盗链或301跳转等等会用到
PS:重定向时,想发出什么请求头,就用R=状态码就可以了
例如301重定向就是这样写的:[R=301,L]
6)正则怎么写?
1、正则部分是不需要处理域名也处理不到域名的,重写从根目录(/)开始
#错误的 RewriteRule htt://www.abc.com/index.html http://www.abc.com/index.php [NC,L] #这个也是错误的 RewriteRule (.*)/index.html $1/index.php [NC,L] #正确的 RewriteRule index.html index.php [NC,L]
2、^和$
^和$是匹配开头和结束的,不限制开头和结束时,相当于模糊匹配
#这个是可以匹配到图片文件链接,做防盗链的 RewriteRule .(jpg|png|gif|jpeg)$ http://www.abc.com/logo.png [R,NC,L] #但下面这样是不行的,图片链接还有域名路径和文件名呢,直接.jpg这样肯定是匹配不上的 RewriteRule ^.(jpg|png|gif|jpeg)$ http://www.abc.com/logo.png [R,NC,L] #下面这样是这是可以的 RewriteRule ^(.+).(jpg|png|gif|jpeg)$ http://www.ot.com/logo.png [R,NC,L]
3、$1 $2 $3 ......??
$1 $2 这些点位符是替换首页正则式匹配上的内容的,一个括号()一个组
RewriteRule ^/article/(d+)/(d+).html$ index.php/article/index/cat_id/$1/id/$2 [NC,L]
前面两个(d+)组,后面用$1 $2代替,再加一个组,就用$3代替,以此类推~
暂时就这样吧,完。