如何redirect其中有空间的url

我从这个URLredirect

www.example.com/article.php?id=12&title=some-title 

到这个URL

 www.example.com/article/12/some-title 

使用这些URL重写规则

 RewriteCond %{THE_REQUEST} ^[AZ]{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

 RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L] 

一个边问题的位,但是你在RewriteRule标志之前缺less一个空格 ,这将导致错误的重写。 它应该是: ...&title=$2 [R=301,L]

关于空格字符(当URL /百分比编码时为%20 )… THE_REQUEST包含URL编码字符,但与RewriteRule 模式匹配的URLpath是URL解码(即文字空间)。 在上面的例子中,这意味着两个不同的正则expression式模式。 所以,为了匹配title中的空格 ,您可以修改现有规则,如下所示:

 RewriteCond %{THE_REQUEST} ^[AZ]{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] 

每个指令稍微修改。

  • CondPattern现在允许一个字面百分比字符(即[\w%-] )。
  • 以下RewriteRule需要NE标志以防止URL编码空间被双重编码(如%2520 )。
  • 最后一个RewriteRule需要将\s (任何空格字符)添加到模式中 。 (或者,您可以使用反斜杠转义空格,即\ ,或者只是一个空格,并用双引号括住整个模式 。)

这只是允许额外的空间 。 虽然CondPattern现在允许任何百分比编码字符,但是RewriteRule模式将其限制为空格


更新#1:允许一些额外的字符… [\w%-] (方括号之间的所有内容)是一个正则expression式字符类 。 要允许更多的字符,只需将这些字符添加到字符类。 例如。 在,,和;的情况下, ,这变成了[\w%,';-] 。 请注意,连字号( - )必须出现在字符类的开始或结尾,因为它是一个特殊的元字符。

要允许任何字符,则可以将模式更改为.+ 。 这只是一个或多个字符。 点表示任何字符。 所以,这将成为:

 RewriteCond %{THE_REQUEST} ^[AZ]{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]