前兩天部署一個(gè)項(xiàng)目到本機(jī)環(huán)境,從nginx轉(zhuǎn)到apache,因?yàn)椴皇煜pache的重寫規(guī)則,給自己挖了很多坑。。看了很多博客后,終于解決了問題,總結(jié)如下。
什么是url重寫?
url重寫可以把冗長的url地址按我們自定義的規(guī)則來簡化。比如一個(gè)類似?www.test.com?user_id=123&user_ps=abc?的域名,通過url重寫,我們直接以?www.test.com/123/abc?的方式來訪問。這樣是不是簡潔多了?這樣既可以增強(qiáng)seo,同時(shí)也可以處理形如訪問url不存在的問題。
啟動(dòng)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、在項(xiàng)目根目錄下創(chuàng)建 .htaccess 文件,在該文件中輸入(windows下無法直接創(chuàng)建。htaccess文件,可先新建記事本,再另存為)
<IfModulemod_rewrite.c>
Options Indexes FollowSymlinks
RewriteEngine On ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#啟動(dòng)重寫引擎
RewriteCond %{REQUEST_FILENAME} !-d ? ? ? ? ? ? ? #判斷請(qǐng)求文件是否為目錄
RewriteCond %{REQUEST_FILENAME} !-f ? ? ? ? ? ? ? #判斷請(qǐng)求文件是否為文件
RewriteRule ^(.*)$ index.php/$1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#重寫規(guī)則,用正則表達(dá)式
</IfModule>
以上即為啟用url重寫的步驟,接下來具體介紹一下.htaccess文件中各字段的意義和屬性。
Options Indexes FollowSymLinks就表示:我訪問www.test.com,如果文件根目錄里有 index.html(index.php),瀏覽器就會(huì)顯示 index.html的內(nèi)容,如果沒有 index.html,瀏覽器就會(huì)顯示這文件根目錄的目錄列表,目錄列表包括文件根目錄下的文件和子目錄。
考慮到安全問題,不想讓別人訪問到目錄文件,應(yīng)該怎么辦呢?只需要將Indexes字段刪掉即可。再次訪問該域名,如果不存在index.html或者index.php文件,則會(huì)報(bào)403錯(cuò)誤。
RewriteEngin On表示啟用重寫引擎,將On改為Off即可關(guān)閉重寫引擎,方便我們啟動(dòng)或關(guān)閉重寫引擎,而無需修改大量代碼。
RewriteCond表示重寫條件,類似于if條件語句,一般形式為? ? RewriteCond %{XXXXXXX} + 正則匹配條件? ? ,可以多條RewriteCond對(duì)應(yīng)一條RewriteRule
RewriteRule 表示重寫規(guī)則,一般形式為? RewriteRule 正則匹配條件? XXXXXX ,上文的
RewriteRule ^(.*)$ index.php/$1
表示將任意請(qǐng)求改成index.php/$1,其中$1表示正則表達(dá)式中第一個(gè)()中的值。
對(duì)于AllowOverride All,表示允許.htaccess覆寫httpd.conf中的設(shè)置,如果想禁止.htaccess起作用 ,將All改成none就可以了
在這里對(duì).htaccess的利弊做一些補(bǔ)充
當(dāng)我們是與其他人共享服務(wù)器的情況下,我們可能無法直接修改服務(wù)器的配置,通過.htaccess可方便我們對(duì)服務(wù)器進(jìn)行修改,且不會(huì)干預(yù)到他人。但這樣做會(huì)導(dǎo)致性能降低,理由如下:
一個(gè).htaccess文件是對(duì)當(dāng)前目錄及其子目錄起作用的,也就是說當(dāng)我們?cè)L問一個(gè)文件時(shí),服務(wù)器不僅要從檢查當(dāng)前目錄下的.htaccess文件,還要檢查其父目錄的,很有可能還要檢查其祖父級(jí)目錄的,無論這些目錄中.htaccess文件是否存在,這樣就可能有很多次的訪問是沒有必要的,影響了性能。
所以如果可以,盡可能直接修改httpd.conf文件,具體的語法與.htaccess文件中的語法是一樣的。