Apache/RewriteRule
RewriteRule指令是重寫引擎的根本。此指令可以多次使用。每個指令定義一個簡單的重寫規則。這些規則的定義順序尤為重要——在執行時,規則是按這個順序逐一生效的。
Pattern是一個作用於當前URL的perl相容的正規表示式。"當前URL"是指該規則生效時刻的URL的值。它可能與被請求的URL截然不同,因為其他規則可能在此之前已經發生匹配並對它做了改動。
SubstitutionSubstitution是當原始URL與Pattern相匹配時,用來替代(或替換)的字串。除了純文字,還可以包含:
- 對Pattern的反向引用($N)
- 對最後匹配的RewriteCond的反向引用(%N)
- 規則條件測試字串(%{VARNAME})中的伺服器變數
- 對映函式呼叫(${mapname:key|default})
[flags]標記作為RewriteRule指令的第三個引數,是一個包含以逗號分隔的下列標記的列表:
'chain|C'(連結下一規則)此標記使當前規則與下一個規則相連結。它產生這樣的效果:如果一個規則被匹配,則繼續處理其後繼規則,也就是這個標記不起作用;如果該規則不被匹 配,則其後繼規則將被跳過。比如,在一個目錄級規則中執行一個外部重定向時,你可能需要刪除".www"(此處不應該出現".www")。
'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(設定cookie)在客戶端設定一個cookie。cookie的名稱是NAME,值是VAL。domain是該cookie的域,比如'.apache.org',可選的lifetime是cookie的有效期(分鐘),可選的path是cookie的路徑。
'env|E=VAR:VAL'(設定環境變數)此標記將環境變數VAR的值為VAL,VAL可以包含可擴充套件的正規表示式反向引用($N和%N)。此標記可以多次使用以設定多個變數。這些變數可以 在其後許多情況下被間接引用,通常是在XSSI()或CGI($ENV{'VAR'})中,也可以在後繼的RewriteCond指令的 CondPattern引數中通過%{ENV:VAR}引用。使用它可以記住從URL中剝離的資訊。
'forbidden|F'(強制禁止URL)強制禁止當前URL,也就是立即反饋一個HTTP響應碼403(被禁止的)。使用這個標記,可以連結若干個RewriteConds來有條件地阻塞某些URL。
'gone|G'(強制廢棄URL)強制當前URL為已廢棄,也就是立即反饋一個HTTP響應碼410(已廢棄的)。使用這個標記,可以標明頁面已經被廢棄而不存在了。
'handler|H=Content-handler'(強制指定內容處理器)強自制定目標檔案的內容處理器為Content-handler。例如,用來模擬mod_alias模組的ScriptAlias指令,以強制對映資料夾內的所有檔案都由"cgi-script"處理器處理。
'last|L'(結尾規則)立即停止重寫操作,並不再應用其他重寫規則。它對應於Perl中的last命令或C語言中的break命令。這個標記用於阻止當前已被重寫的URL被後繼規則再次重寫。例如,使用它可以重寫根路徑的URL('/')為實際存在的URL(比如:'/e/www/')。
'next|N'(從頭再來)重新執行重寫操作(從第一個規則重新開始)。此時再次進行處理的URL已經不是原始的URL了,而是經最後一個重寫規則處理過的URL。它對應於 Perl中的next命令或C語言中的continue命令。此標記可以重新開始重寫操作(立即回到迴圈的開頭)。但是要小心,不要製造死迴圈!
'nocase|NC'(忽略大小寫)它使Pattern忽略大小寫,也就是在Pattern與當前URL匹配時,'A-Z'和'a-z'沒有區別。
'noescape|NE'(在輸出中不對URI進行轉義)此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 一般情況下,特殊字元('%', '$', ';'等)會被轉義為等值的十六進位制編碼('%25', '%24', '%3B'等)。此標記可以阻止這樣的轉義,以允許百分號等符號出現在輸出中,比如:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]可以使'/foo/zed轉向到一個安全的請求'/bar?arg=P1=zed'。
'nosubreq|NS'(不對內部子請求進行處理)在當前請求是一個內部子請求時,此標記強制重寫引擎跳過該重寫規則。比如,在mod_include試圖搜尋目錄預設檔案(index.xxx) 時,Apache會在內部產生子請求。對於子請求,重寫規則不一定有用,而且如果整個規則集都起作用,它甚至可能會引發錯誤。所以,可以用這個標記來排除 某些規則。 使用原則:如果你為URL新增了CGI指令碼字首,以強制它們由CGI指令碼處理,但對子請求處理的出錯率(或者資源開銷)很高,在這種情況下,可以使用這個 標記。
'proxy|P'(強制為代理)此標記使替換成分被內部地強制作為代理請求傳送,並立即中斷重寫處理,然後把處理移交給mod_proxy模組。你必須確保此替換串是一個能夠被mod_proxy處理的有效URI(比如以http://hostname開頭),否則將得到一個代理模組返回的錯誤。使用這個標記,可以把某些遠端成分對映到本地伺服器域名空間,從而增強了ProxyPass指令的功能。
注意:要使用這個功能,必須已經啟用了mod_proxy模組。
'passthrough|PT'(移交給下一個處理器)此標記強制重寫引擎將內部request_rec結構中的uri欄位設定為filename欄位的值,這個小小的修改使得RewriteRule指 令的輸出能夠被(從URI轉換到檔名的)Alias, ScriptAlias, Redirect等指令進行後續處理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。舉一個能說明其含義的例子: 如果要將/abc重寫為/def, 然後再使用mod_alias將/def轉換為/ghi,可以這樣:
RewriteRule ^/abc(.*) /def$1 [PT] Alias /def /ghi
如果省略了PT標記,雖然將uri=/abc/...重寫為filename=/def/...的部分運作正常,但是後續的mod_alias在試圖將URI轉換到檔名時會遭遇失效。
注意:如果需要混合使用多個將URI轉換到檔名的模組時,就必須使用這個標記。。此處混合使用mod_alias和mod_rewrite就是個典型的例子。
此標記強制重寫引擎在已有的替換字串中追加一個查詢字串,而不是簡單的替換。如果需要通過重寫規則在請求串中增加資訊,就可以使用這個標記。
'redirect|R [=code]'(強制重定向)若Substitution以http://thishost[:thisport]/(使 新的URL成為一個URI)開頭,可以強制性執行一個外部重定向。如果沒有指定code,則產生一個HTTP響應碼302(臨時性移動)。如果需要使用在 300-400範圍內的其他響應程式碼,只需在此指定即可(或使用下列符號名稱之一:temp(預設), permanent, seeother)。使用它可以把規範化的URL反饋給客戶端,如將"/~"重寫為"/u/",或始終對/u/user加上斜槓,等等。
注意:在使用這個標記時,必須確保該替換欄位是一個有效的URL。否則,它會指向一個無效的位置!並且要記住,此標記本身只是對URL加上http://thishost[:thisport]/字首,重寫操作仍然會繼續進行。通常,你還會希望停止重寫操作而立即重定向,那麼就還需要使用'L'標記。
'skip|S=num'(跳過後繼規則)此標記強制重寫引擎跳過當前匹配規則之後的num個規則。它可以模擬if-then-else結構:最後一個規則是then從句,而被跳過的skip=N個規則是else從句。注意:它和'chain|C'標記是不同的!
'type|T=MIME-type'(強制MIME型別)強制目標檔案的MIME型別為MIME-type,可以用來基於某些特定條件強制設定內容型別。比如,下面的指令可以讓.php檔案在以.phps 副檔名呼叫的情況下由mod_php按照PHP原始碼的MIME型別(application/x-httpd-php-source)顯示:
RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
相關文章
- Apache RewriteRuleApache
- RewriteRule QSA用法
- RewriteCond與RewriteRule用法
- Apache之Rewrite和RewriteRule規則梳理以及http強轉https的配置總結ApacheHTTP
- htaccess RewriteRule 解決多種格式的URL解析
- Apache Sqoop與Apache Flume比較ApacheOOP
- Apache Ignite 與 Apache Spark比較ApacheSpark
- 使用 Apache OpenWebBeans 和 Apache Tomcat | JavalobbyApacheWebBeanTomcatJava
- 彈性整合Apache Mesos與Apache Kafka框架ApacheKafka框架
- Apache Lucene 4.1 和Apache Solr 4.1 釋出ApacheSolr
- XAMPP, Apache - Error: Apache shutdown unexpectedly 解決方法ApacheError
- Apache簡介Apache
- Apache之HttpClientApacheHTTPclient
- Apache + PHP配置ApachePHP
- Apache和 nginxApacheNginx
- Nginx vs ApacheNginxApache
- Apache安裝Apache
- 使用Apache Spark和Apache Hudi構建分析資料湖ApacheSpark
- 簡單比較 Apache Kafka 和 Apache Pulsar要點 - JaroslawApacheKafkaJARROS
- apache-淺析apache優化的幾點建議Apache優化
- 資料湖倉比較:Apache Hudi、Delta Lake、Apache IcebergApache
- Apache Rewrite詳解Apache
- Apache Impala 架構Apache架構
- apache 新增 httpsApacheHTTP
- Apache(httpd)詳解Apachehttpd
- Apache Tika實戰Apache
- apache路由埠配置Apache路由
- Apache Ignite剖析Apache
- What Is Apache HadoopApacheHadoop
- 讓apache支援phpApachePHP
- Nginx/Apache發大招NginxApache
- 配置dns和apacheDNSApache
- apache配置反向代理Apache
- apache版本資訊控制Apache
- Apache, Oracle, 以及JCKApacheOracle
- Apache POI 操作ExcelApacheExcel
- 開源Apache KafkaApacheKafka
- Apache Pinot 簡介Apache