歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Apache中rewrite偽靜態規則介紹

Apache中rewrite偽靜態規則介紹

日期:2017/3/1 18:04:21   编辑:Linux技術

Rewirte主要的功能就是實現URL的跳轉,它的正則表達式是基於Perl語言。可基於服務器級的(httpd.conf)和目錄級的(.htaccess)兩種方式。如果要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時候就直接安裝rewrite模塊,別一種是編譯apache時以DSO模式安裝apache,然後再利用源碼和apxs來安裝rewrite模塊

基於服務器級的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下直接利用RewriteEngine on來打開rewrite功能;另一種是在局部裡利用RewriteEngine on來打開rewrite功能,下面將會舉例說明,需要注意的是,必須在每個virtualhost裡用RewriteEngine on來打開rewrite功能。否則virtualhost裡沒有RewriteEngine on它裡面的規則也不會生效。

基於目錄級的(.htaccess),要注意一點那就是必須打開此目錄的FollowSymLinks屬性且在.htaccess裡要聲明RewriteEngine on。

實戰

例子:


復制代碼代碼如下:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] 這裡”-”表示沒有替換,浏覽器為IE和Opera的訪客將被禁止訪問。

例子:


復制代碼代碼如下:
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+).html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php

使用Apache的URL Rewrite配置多用戶虛擬服務器

要實現這個功能,首先要在DNS服務器上打開域名的泛域名解析(自己做或者找域名服務商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。

然後,看一下我的Apache中關於*.kiya.us的虛擬主機的設定。


復制代碼代碼如下:
ServerAdmin [email protected]
DocumentRoot /home/www/111cn.net
ServerName dns.kiya.us
ServerAlias dns.kiya.us kiya.us *.kiya.us
CustomLog /var/log/httpd/osa/access_log.log” common
ErrorLog /var/log/httpd/osa/error_log.log”
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/111cn.net/sylvan$3?un=$1&%{QUERY_STRING} [L]


在這段設定中,我把*.kiya.cn和*.kiya.us 的Document Root都設定到了 /home/www/111cn.net

限制目錄只能顯示圖片


復制代碼代碼如下:
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
< /IfModule>


RewriteRule規則表達式的說明:
. 匹配任何單字符
[chars] 匹配字符串:chars
[^chars] 不匹配字符串:chars
text1|text2 可選擇的字符串:text1或text2
? 匹配0到1個字符
* 匹配0到多個字符
+ 匹配1到多個字符
^ 字符串開始標志
$ 字符串結束標志
n 轉義符標志

反向引用 $N 用於 RewriteRule 中匹配的變量調用(0 <= N <= 9)
反向引用 %N 用於 RewriteCond 中最後一個匹配的變量調用(1 <= N <= 9)

RewriteCond適用的標志符
‘nocase|NC’ (no case)忽略大小
‘ornext|OR’ (or next condition)邏輯或,可以同時匹配多個RewriteCond條件

RewriteRule適用的標志符

‘redirect|R [=code]’ (force redirect)強迫重寫為基於http開頭的外部轉向(注意URL的變化) 如:[R=301,L]
‘forbidden|F’ (force URL to be forbidden)重寫為禁止訪問
‘proxy|P’ (force proxy)重寫為通過代理訪問的http路徑
‘last|L’ (last rule)最後的重寫規則標志,如果匹配,不再執行以後的規則
‘next|N’ (next round)循環同一個規則,直到不能滿足匹配
‘chain|C’ (chained with next rule)如果匹配該規則,則繼續下面的有Chain標志的規則。
‘type|T=MIME-type’ (force MIME type)指定MIME類型
‘nosubreq|NS’ (used only if no internal sub-request)如果是內部子請求則跳過
‘nocase|NC’ (no case)忽略大小
‘qsappend|QSA’ (query string append)附加查詢字符串
‘noescape|NE’ (no URI escaping of output)禁止URL中的字符自動轉義成%[0-9]+的形式。
‘passthrough|PT’ (pass through to next handler)將重寫結果運用於mod_alias
’skip|S=num’ (skip next rule(s))跳過下面幾個規則
‘env|E=VAR:VAL’ (set environment variable)添加環境變量

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=zoo
13) PT(pass through to next handler) 傳遞給下一個處理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 將會交給/def規則處理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳過num條規則
15) E=VAR:VAL(set environment variable) 設置環境變量

Copyright © Linux教程網 All Rights Reserved