1. 程式人生 > >Apache下的AllowOverride和.htaccess

Apache下的AllowOverride和.htaccess

<VirtualHost *:80>
  ServerName www.test.com
  ServerAlias www.test.com
  DocumentRoot "F:\wamp\www\test"
  <Directory "F:\wamp\www\test">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride None
    DirectoryIndex index.php index.html
    Require all granted
  </Directory>
</VirtualHost>

注意配置Chorme代理關閉,在httpd.conf中將directory相應更改,配置DirectoryIndex index.php index.html 

apache裡面有一個很好用的服務,偽靜態技術,也就是URL Rewrite(URL重寫),它配合利用正則表示式,可以將url進行修改,可以利用網站的seo,也可以使url變得更加整潔,很是方便。

這裡面牽扯到幾個配置很有趣。有時候,我們需要修改apache預設配置,但是,我們卻不想對apache的http.conf進行太多的修改,所以我們使用.htaccess(分散式配置檔案)來達到我們的目的。.htaccess提供了針對每個目錄改變配置的方法,即在一個特定的目錄中放置一個包含指令的檔案,其中的指令作用於此目錄及其所有子目錄。

不過,我們需要讓apache來讀取它,這裡就需要修改apache下的http.conf了。

我們的apache都有自己專案的預設根目錄,在DocumentRoot "D:/www"下面(這裡以我的路徑為例子) ,有一個叫<Directory>的東西,它裡面有這樣一段程式碼:AllowOverride None,如果我們把None改成All,那麼我們的www目錄下所有專案都能讀取到.htaccess了。

一個單詞就解決了我們的問題,固然方便,但是它的弊端也很多。例如每次訪問專案時,apache都會對每一個.htaccess檔案進行讀取,處理速度大幅度降低;每一個專案都能進行apache的配置修改,安全性大大降低等。

AllowOverride 它只能在<Directory>中生效,一般從安全性考慮,根目錄的AllowOverride屬性一般都配置成不允許任何Override,AlloOverride指令按類別決定了.htaccess檔案中那些指令才是有效的,當AlloOverride設定成None時,相應的配置目錄下的.htaccess檔案是不被讀取的,即無法生效。當AlloOverride設定成All時所以具有.htaccess的作用於的指令都會生效,意味著原apache指令會被.htaccess檔案中的指令重寫

因此有時候我們只需要新增一個<Directory>,路徑指到個人專案就行了。例如:

<Directory "D:/www/my_app">

Options Indexes FollowSymLinks    #顯示當前資料夾下的所有檔案

  AllowOverride All #允許重寫apache預設配置

</Directory>

雖然如此,一般都儘可能避免使用.htaccess檔案,任何希望放在.htaccess檔案中的配置,都可放在主配置的<Directory>段中,而且高效

避免使用的原因主要有:

首先是效能。如果AllowOverride啟用了.htaccess檔案,則Apache需要在每個目錄中查詢.htaccess檔案,因此,無論是否真正用到,啟用.htaccess都會導致效能的下降。另外,對每一個請求,都需要讀取一次.htaccess檔案。還有,Apache必須在所有上級的目錄中查詢.htaccess檔案,以使所有有效的指令都起作用(參見指令的生效)

其次是安全。這樣會允許使用者自己修改apache的配置,這可能會導致某些意想不到的修改,所以請認真考慮是否應當給予使用者這樣的特權。但是,如果給予使用者較少的特權而不能滿足其需要,則會帶來額外的技術支援請求,所以,必須明確地告訴使用者已經給予他們的許可權,說明AllowOverride設定的值,並引導他們參閱相應的說明,以免日後生出許多麻煩。