2011-02-26 66 views
2

我使用WAMPServer 2.1運行Windows 7 64位。 Apache運行的版本是2.2.17。我試圖建立一個簡單的重寫規則在httpd.confApache mod_rewrite在WAMPServer中返回錯誤的請求

<IfModule rewrite_module> 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?page=$1 [PT,QSA,L] 
</IfModule> 

我已經得到簡單的RewriteRules以前工作,沒有正則表達式,重寫的表達,等等。但是,現在看來,在此規則處於活動狀態時,如果嘗試訪問任何URL,我會收到400 Bad Request錯誤。 Apache的日誌文件給出了這些錯誤,每當出現這種情況:

[Sat Feb 26 10:24:18 2011] [error] [client 127.0.0.1] Invalid URI in request GET /index.php HTTP/1.1 
[Sat Feb 26 10:24:21 2011] [error] [client 127.0.0.1] Invalid URI in request GET/HTTP/1.1 

的第一個錯誤我試着打localhost/index.php。第二個我只是試過localhost

此外,即使當我有更簡單的規則工作,RewriteCond行似乎並沒有工作:靜態現有文件,如style.css無論如何正在重新路由。

啓用RewriteLogging似乎崩潰了Apache,它似乎是一個documented issue on 64-bit machines running Windows 7。任何想法可能是什麼問題?

回答

1

這裏有兩個問題可能會導致你的麻煩。首先,您不能在服務器上下文中輕鬆檢查文件的存在(就像使用httpd.conf一樣),因爲請求尚未映射到文件系統。

如果你的靜態資源的請求發生直接對應於超出你DOCUMENT_ROOT你的文件系統結構,可以通過附加傳入REQUEST_URI前DOCUMENT_ROOT的值解決這個問題,如下所示:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d 

如果路徑你的靜態資源的地方降壓變換線,mod_rewrite documentation建議使用以下,這將發出一個子請求基於請求URI進行前瞻:

RewriteCond %{LA-U:REQUEST_FILENAME} !-f 
RewriteCond %{LA-U:REQUEST_FILENAME} !-d 

雖然這種方法比較昂貴,所以儘可能使用第一個方法。

其次,您傳遞迴請求的URI實際上是無效的,因爲它需要前導斜槓。糾正並與新的環境相結合上面給你這個修改後的規則集:

RewriteEngine On 

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d 
RewriteRule ^.*$ /index.php?page=$0 [PT,QSA,L] 

注意的page這裏的值總是有一個斜線,所以你可能真的想使用這個規則,而根據在你的index.php中處理邏輯:

RewriteRule ^/(.*)$ /index.php?page=$1 [PT,QSA,L] 
+0

這似乎是問題所在。另外,我最終必須使用底部修改的重寫規則(在匹配的正則表達式中使用'/'),因爲其他模式仍然向我發送了來自瀏覽器的400個錯誤請求錯誤(並且在apache日誌)。 – Scott 2011-02-28 11:03:45

0

你有沒有嘗試設置

RewriteBase/your_directory

變量?

+0

是的。 RewriteBase導致Apache根本無法啓動,錯誤爲'RewriteBase:只在每個目錄下的配置文件有效'(我使用的是httpd.conf)。 – Scott 2011-02-26 16:05:28