我从这个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]
每个指令稍微修改。
[\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]