2011-06-08 68 views
0

我想要(例如)这个URL重写有什么问题?

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 

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

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

回答

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

要调试,您可以随时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

工作对我来说:

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

这就是我说的 – Teneff 2011-06-08 13:24:14

+2

@Teneff:差不多。正如其他人所说,你错过了\ w不匹配。无论如何,算法代码今天正在降低心情。 – 2011-06-08 13:28:43