如何重定向包含空格的 URL

如何重定向包含空格的 URL

我正在从此 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]

相关内容