2013-04-24 80 views
2

我有一個網站使用apache mod_rewrite,並且一直在過去6個月沒有錯誤的工作。Apache mod_rewrite沒有將表達式映射到參數

我有以下重寫規則:

RewriteRule ^products/([a-z\-]+)/$ /products.php?category=$1 [NC,L] 

這裏是我的網頁代碼products.php

$category = $_GET['category']; 

if (isset($category)) { 
    // do some processing here 
} 
else { 
    header("Location: /500.html"); 
    exit; 
} 

其打這個規則鏈接的一個例子是/products/lighting-poles/

有誰知道爲什麼實際重寫仍然在發生,但沒有將([a-z\-]+)映射到category=$1

額外的信息

我注意到.htaccess文件的主機上已經註釋掉線Options +FollowSymLinks所以我第一次嘗試重新啓用這個只有擁有該網站返回一個Apache白色屏幕500錯誤。從.htaccess文件

<IfModule mod_rewrite.c> 
#Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

# Add a trailing slash to paths without an extension 
RewriteCond %{REQUEST_METHOD} !POST 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule ^(.*)$ $1/ [L,R=301] 

# other rules including problem rule here 

</IfModule> 
+0

你是什麼意思重寫的意思是發生? products.php腳本仍然被調用? – 2013-04-24 00:20:44

+0

是的,沒有400錯誤,腳本仍然退出products.php – samazi 2013-04-24 00:22:15

+0

您不需要在字符類中跳過連字符。只要把它放在第一或最後,例如'[a-z-]' – Phil 2013-04-24 00:26:47

回答

3

更多這聽起來病態像一個多視圖的問題。 Multiviews是一個內容協商的事情,如果它啓用,它會嘗試URL-file映射管道中的一些不同的額外事情,以嘗試查找映射到URL的文件。這裏有一個URL,如/products/blah,但是,您有一個名爲products.php的文件,因此多視圖可能會嘗試將products映射到/products.php/blah。因此完全繞過了重寫規則,並且您看不到category參數。

凡選項,試着加入:

Options -Multiviews 
+0

這聽起來很可能,所以我試圖將這個選項添加到'.htaccess',但這導致該網站顯示一個默認的Apache'500錯誤'頁面,你認爲' VirtualHost'不允許覆蓋選項?另一方面,主機上週將安全補丁應用於服務器。 – samazi 2013-04-24 07:33:05

+0

我剛剛修改了'apache'的本地版本以使用'Multiview'選項(因爲ISP支持已經回家了),現在我能夠重現錯誤!我相信你是正確的,並感謝你分享你寶貴的知識。 – samazi 2013-04-24 08:12:31