Apache mod_rewrite没有将表达式映射到参数

时间:2013-04-24 00:18:36

标签: php apache .htaccess mod-rewrite

我有一个使用apache mod_rewrite的网站,过去6个月一直没有错误。

我有以下重写规则:

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>

1 个答案:

答案 0 :(得分:3)

这听起来像是一个多视图问题。 Multiviews是一个内容协商的东西,如果它被打开,它会在URL文件映射管道中尝试一些不同的额外的东西,试图找到映射到URL的文件。您有/products/blah之类的网址,但是您有一个名为products.php的文件,因此多视图可能会尝试将products映射到/products.php/blah。因此,完全绕过重写规则,您没有看到category参数。

选项如何,请尝试添加:

Options -Multiviews