url重写(urlrewrite)的一些系统变量
學php也有3年了,一直對url重寫不是很了解,本學用到的話都是百度一下,再復制作簡單修改,一些變量的參數都不太了解什么意思,難得今天有時間,做個筆記吧!
1)可用的一些系統變量,在重寫條件和重寫規則里都可以使用,格式為 %{name_of_variable}
?
| 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 | ? |
| 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代替,以此類推~
?
暫時就這樣吧,完。
轉載于:https://www.cnblogs.com/tujia/p/6277934.html
總結
以上是生活随笔為你收集整理的url重写(urlrewrite)的一些系统变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鹿晗和关晓彤分手了吗(鹿晗和关晓彤现阶段
- 下一篇: 林徽因和三个男人的故事(民国才女林徽因的