这个URL重写有什么问题?

时间:2011-06-08 12:46:40

标签: php apache mod-rewrite

我想要(例如)

discuss/1/title/where-are-you

输出

discussPage.php?id=1&title=where-are-you

我在.htaccess文件中有以下命令,该文件与discussPage.php位于同一目录中:

# Enable Rewriting
RewriteEngine on

# Rewrite user URLs
#   Input:  discuss/ID/title/TITLE
#   Output: discussPage.php?tid=NAME&title=TITLE

RewriteRule ^discuss/(\w+)/(\w+)/(\w+)/?$ discussPage.php?id=$1&title=$3

现在,当我尝试访问404这样的网页时出现discuss/1/title/where-are-you错误,即使discussPage.php?id=1&title=where-are-you works fine.

P.S。 mod_rewrite已启用(我已将其用于其他目的)。

3 个答案:

答案 0 :(得分:2)

你的问题是\ w与最后一位的“ - ”不匹配。

您可以使用更广泛的字符类[\w-]+来简单地允许破折号。我会小心使用像[^/]这样的解决方案,因为它们允许除了斜杠以外的任何东西,这是非常宽容的。白名单总是更安全,避免意外。

# Enable Rewriting
RewriteEngine on

# Rewrite user URLs
#   Input:  discuss/ID/title/TITLE
#   Output: discussPage.php?tid=NAME&title=TITLE

RewriteRule ^discuss/(\w+)/(\w+)/([\w-]+)/?$ discussPage.php?id=$1&title=$3

请注意,-必须是字符类中的最后一个,否则你应该将其转义,因为如果它在两个其他字符之间,则表现为范围,如[a-z]

答案 1 :(得分:-1)

要进行调试,您始终可以echo $_SERVER['QUERY_STRING'];

但我相信正确的代码会是这样的。

RewriteEngine on
RewriteBase /

    RewriteRule ^discuss/([0-9]+)/title/([a-z0-9\-]+)?$ discussPage.php?id=$1&title=$2 [NC,QSA]

但是,您可能希望修复RewriteBase值。

另外 - 如上一个条件所示,where-are-you部分中只能包含字母数字字符和连字符。 (但有些东西告诉我你不需要其他角色!)

答案 2 :(得分:-2)

适合我:

RewriteEngine On
RewriteBase /
RewriteRule ^discuss/([^/]+)/([^/]+)/([^/]+)/?$ discussPage.php?id=$1&title=$3 [R]