前兩天部署一個項目到本機環(huán)境,從nginx轉(zhuǎn)到apache翩瓜,因為不熟悉apache的重寫規(guī)則受扳,給自己挖了很多坑。兔跌】备撸看了很多博客后,終于解決了問題坟桅,總結(jié)如下华望。
什么是url重寫?
url重寫可以把冗長的url地址按我們自定義的規(guī)則來簡化仅乓。比如一個類似?www.test.com赖舟?user_id=123&user_ps=abc?的域名,通過url重寫夸楣,我們直接以?www.test.com/123/abc?的方式來訪問宾抓。這樣是不是簡潔多了?這樣既可以增強seo,同時也可以處理形如訪問url不存在的問題豫喧。
啟動url重寫的步驟如下
1石洗、打開apache/conf目錄下的httpd.conf,找到
#LoadModule rewrite_module modules/mod_rewrite.so
將最前面的#去掉
2紧显、找到
<Directory />?
?AllowOverride NONE? ?
?Require all granted
</Directory>
改成
<Directory />
AllowOverride ALL ?
Require all granted
</Directory>
3讲衫、在項目根目錄下創(chuàng)建 .htaccess 文件,在該文件中輸入(windows下無法直接創(chuàng)建孵班。htaccess文件涉兽,可先新建記事本,再另存為)
<IfModulemod_rewrite.c>
Options Indexes FollowSymlinks
RewriteEngine On ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#啟動重寫引擎
RewriteCond %{REQUEST_FILENAME} !-d ? ? ? ? ? ? ? #判斷請求文件是否為目錄
RewriteCond %{REQUEST_FILENAME} !-f ? ? ? ? ? ? ? #判斷請求文件是否為文件
RewriteRule ^(.*)$ index.php/$1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#重寫規(guī)則篙程,用正則表達式
</IfModule>
以上即為啟用url重寫的步驟枷畏,接下來具體介紹一下.htaccess文件中各字段的意義和屬性。
Options Indexes FollowSymLinks就表示:我訪問www.test.com虱饿,如果文件根目錄里有 index.html(index.php)矿辽,瀏覽器就會顯示 index.html的內(nèi)容,如果沒有 index.html郭厌,瀏覽器就會顯示這文件根目錄的目錄列表袋倔,目錄列表包括文件根目錄下的文件和子目錄。
考慮到安全問題折柠,不想讓別人訪問到目錄文件宾娜,應(yīng)該怎么辦呢?只需要將Indexes字段刪掉即可扇售。再次訪問該域名前塔,如果不存在index.html或者index.php文件嚣艇,則會報403錯誤。
RewriteEngin On表示啟用重寫引擎华弓,將On改為Off即可關(guān)閉重寫引擎食零,方便我們啟動或關(guān)閉重寫引擎,而無需修改大量代碼寂屏。
RewriteCond表示重寫條件贰谣,類似于if條件語句,一般形式為? ? RewriteCond %{XXXXXXX} + 正則匹配條件? ? 迁霎,可以多條RewriteCond對應(yīng)一條RewriteRule
RewriteRule 表示重寫規(guī)則吱抚,一般形式為? RewriteRule 正則匹配條件? XXXXXX ,上文的
RewriteRule ^(.*)$ index.php/$1
表示將任意請求改成index.php/$1,其中$1表示正則表達式中第一個()中的值考廉。
對于AllowOverride All秘豹,表示允許.htaccess覆寫httpd.conf中的設(shè)置,如果想禁止.htaccess起作用 昌粤,將All改成none就可以了
在這里對.htaccess的利弊做一些補充
當(dāng)我們是與其他人共享服務(wù)器的情況下既绕,我們可能無法直接修改服務(wù)器的配置,通過.htaccess可方便我們對服務(wù)器進行修改涮坐,且不會干預(yù)到他人凄贩。但這樣做會導(dǎo)致性能降低,理由如下:
一個.htaccess文件是對當(dāng)前目錄及其子目錄起作用的膊升,也就是說當(dāng)我們訪問一個文件時,服務(wù)器不僅要從檢查當(dāng)前目錄下的.htaccess文件谭企,還要檢查其父目錄的廓译,很有可能還要檢查其祖父級目錄的,無論這些目錄中.htaccess文件是否存在债查,這樣就可能有很多次的訪問是沒有必要的非区,影響了性能。
所以如果可以盹廷,盡可能直接修改httpd.conf文件征绸,具體的語法與.htaccess文件中的語法是一樣的。