2013-04-24 77 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