我正在从此 URL 重定向
www.example.com/article.php?id=12&title=some-title
到此 URL
www.example.com/article/12/some-title
使用这些 URL 重写规则
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [R=301,L]
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]
但如果 URL 中有空间例如在其中
www.example.com/article.php?id=12&title=some%20title
那么上述规则将不起作用。如何才能使此 URL 仅使用上述规则起作用.htaccess
?
答案1
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]
有点次要的问题,但你忽略了一个空间在标志之前RewriteRule
,这将导致错误的重写。应该是:...&title=$2 [R=301,L]
。
关于空格字符(%20
当 URL/百分比编码时)...THE_REQUEST
包含 URL 编码字符,但与 URL 路径匹配RewriteRule
图案是 URL 解码的(即文字空格)。在上面的例子中,这意味着两个不同的正则表达式模式。因此,为了匹配空间您title
可以修改现有规则,例如:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w%-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/([\w\s-]+)$ article.php?id=$1&title=$2 [R=301,L]
每个指令都略有修改。
- 这条件模式现在允许使用文字百分比字符(即
[\w%-]
)。 NE
以下内容需要该标志RewriteRule
,以防止 URL 编码空间被双重编码(例如%2520
)。- 最后
RewriteRule
需要将\s
(任何空格字符)添加到图案. (或者,您也可以使用反斜杠转义的空格,即\
,或者只是空间并包围整个图案用双引号引起来。)
这只是允许额外的空间。 虽然条件模式现在允许任何百分比编码字符,该RewriteRule
模式将其限制为空格。
更新#1:允许一些附加字符... [\w%-]
(方括号之间的所有内容)是正则表达式字符类,
。要允许更多字符,只需将这些字符添加到字符类中。例如,在、'
和 的情况下;
,这变为[\w%,';-]
。请注意,连字符 ( -
) 必须出现在字符类的开头或结尾,因为它是一个特殊的元字符。
允许任何字符,那么你可以将模式更改为.+
。这只是 1 个或多个字符。点表示任何字符。因此,这将变成:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=(.+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/(.+) article.php?id=$1&title=$2 [R=301,L]