首頁能打開,而其他頁面404錯誤,但使用index.php后就能打開的問題
這是前幾天用CI框架搭建環境時遇到的一個問題,Apache+PHP環境下,首頁能打開,而其他頁面404錯誤,但使用index.php后就能打開的問題。
問題
當時就想,應該是URL重寫的問題,查看了apache的 httpd.conf 中 mod_rewrite.so 重寫模塊是開啟的,在安裝的程序目錄查看 .htaccess 中查看重寫規則也沒有問題,最后查看CI框架的URL路由也沒得問題。這有點讓人郁悶了,這問題到底是出在那里呢?
解決辦法
各種搜索半天,黃天不負有心人,找到問題了。是在虛機配置中沒有把?AllowOverride 打開,導致無法加載 .htaccess 文件引起的。 本人菜鳥,大神勿噴哈。
AllowOverride 參數 None 改成 All 。重啟,問題解決了。
虛機的配置如下:
- <VirtualHost *:80>
- DocumentRoot "e:/wosn/"
- ServerName wosn.net
- <Directory "e:/wosn/">
- Options Indexes FollowSymLinks
- AllowOverride ALL
- Require all granted
- </Directory>
- </VirtualHost>
相關介紹:Apache下的AllowOverride和.htaccess
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,AllowOverride指令按類別決定了 .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設置的值,并引導他們參閱相應的說明,以免日后生出許多麻煩。