在Apache服務(wù)器使用mod_rewrite模塊重定向URL
2017-02-01 23:08:35
13705
在Web開發(fā)中,通常設(shè)置HTTP能在URL不映射文件系統(tǒng)中的文件時(shí)訪問(wèn)資源。 雖然可以在某種程度上使用重定向語(yǔ)句來(lái)解決這個(gè)問(wèn)題,但是許多部署對(duì)于URL重寫具有更復(fù)雜的需求。 Apache的mod_rewrite提供重寫功能,以便用戶使用簡(jiǎn)潔明了的URL進(jìn)行交互,同時(shí)仍然能夠?yàn)楣芾韱T提供他們認(rèn)為合適的網(wǎng)站目錄架構(gòu)。
重寫URL
在塊或.htaccess文件中,使用以下行啟用mod_rewrite:
RewriteEngine on
您可以創(chuàng)建任意數(shù)量的重寫規(guī)則。 這些規(guī)則提供了服務(wù)器比較入站請(qǐng)求的模式。 如果請(qǐng)求與重寫模式匹配,則服務(wù)器按照規(guī)則所述修改請(qǐng)求,并處理該請(qǐng)求。 下面是一個(gè)重寫規(guī)則的例子:
RewriteRule ^post-id/([0-9]+)$ /posts/$1.html
讓我們解析這條規(guī)則:首先,請(qǐng)注意,第一個(gè)字符串是匹配傳入請(qǐng)求的模式。 第二個(gè)字符串指定要提供的實(shí)際文件。 Mod_rewrite模式使用正則表達(dá)式語(yǔ)法:^匹配字符串的開頭,$匹配字符串的結(jié)尾,這意味著重寫引擎不會(huì)重寫與模式部分匹配的字符串。
上面的例子會(huì)重寫指定以/post-id/開頭的路徑的所有URL,并包含一個(gè)或多個(gè)數(shù)字(例如[0-9]+),在/posts/目錄中提供相應(yīng)的.html文件。 模式中的括號(hào)術(shù)語(yǔ)指定了作為$1,$2,$3等傳遞給第二個(gè)字符串的變量。
您可以創(chuàng)建和應(yīng)用多個(gè)重寫規(guī)則,但這些規(guī)則是順序匹配的。 表示RewriteRules的順序可?影響匹配的規(guī)則。
或者,您可以插入RewriteBase指令來(lái)修改重寫規(guī)則的行?。 讓我們假設(shè):
這些指令是為/srv/www/example.com/public_html/目錄指定的。
某些用戶以http://www.tjdsmy.cn/post-id/200形式發(fā)送請(qǐng)求,其中200可能是長(zhǎng)于一位數(shù)的任何數(shù)字。
某些用戶以http://www.tjdsmy.cn/page/title-of-page的形式發(fā)送請(qǐng)求,其中“title of page”可能代表任何字符串。
這些文件位于/srv/www/example.com/public_html/objects/上,匹配請(qǐng)求文件名稱,擴(kuò)展名為.html。
RewriteEngine on
RewriteBase /objects
RewriteRule ^post-id/([0-9]+)$ $1.html
RewriteRule ^page/([^/]+)$ $1.html
上面的重寫規(guī)則集作用如下:
http://www.tjdsmy.cn/post-id/200/,提供位于/srv/www/example.com/public_html/objects/200.html的文件
http://www.tjdsmy.cn/page/free-the-toast/,提供位于/srv/example.com/public_html/objects/free-the-toast.html的文件
在特定條件下重寫URL
使用RewriteCond參數(shù),您可以限制使用RewriteRule的條件。 讓我們從WordPress應(yīng)用程序的默認(rèn)重寫規(guī)則中獲取以下示例:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
在此示例中,以上下文的頂層開始的所有請(qǐng)求都受重寫規(guī)則的影響。 這由RewriteBase /指令指定。 上下文由在虛擬主機(jī),目錄塊或.htaccess文件中指定偽指令的位置決定。
RewriteCond語(yǔ)句指示Apache僅當(dāng)滿足條件時(shí)才應(yīng)用遵循的規(guī)則。 在上述示例中,匹配請(qǐng)求的文件名稱在文件系統(tǒng)上不存在(例如,!-f),或者目錄不存在(例如!-d)的請(qǐng)求。
簡(jiǎn)而言之,如果兩者都為真,并且文件和目錄都不存在,則Web服務(wù)器將請(qǐng)求附加到index.php。 也就是說(shuō),f用戶請(qǐng)求http://www.tjdsmy.cn/?post=123或http://www.tjdsmy.cn/post/123,服務(wù)器將返回index.php?post=123或index.php/post/123。
mod_rewrite設(shè)置響應(yīng)碼
最后,有一些代碼,你可以附加到一個(gè)RewriteRule,修改重寫的行為。 在前面的例子RewriteRule ./index.php [L],我們看到代表“最后規(guī)則”的[L]選項(xiàng)。 這阻止Apache應(yīng)用任何其他重寫規(guī)則。 最常見的附加選項(xiàng)包括:
F告訴客戶端該URL被禁止,用HTTP代碼403響應(yīng)。
N強(qiáng)制mod_rewrite重新開始重寫過(guò)程,并允許多階段重寫。
R告訴客戶端所請(qǐng)求的頁(yè)面已經(jīng)移動(dòng),具有用于臨時(shí)重定向的HTTP代碼302。 要表示該網(wǎng)頁(yè)已永久移動(dòng),請(qǐng)指定“R=301”。
您可以在RewriteRule結(jié)尾處指定多個(gè)選項(xiàng),用逗號(hào)分隔它們,如:[L,R=301]