htaccess将%3F和%3D重写为?和=

时间:2012-11-23 14:19:54

标签: .htaccess rewrite

我想重写最后有%3Ffull%3D1?full=1的所有传入网址

我在htaccess尝试这个但不行:

RewriteRule ^(.*)%3F(.+)%3D(.+)$ $1?$2=$3 [R=301]

这里是完整的.htaccess

<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule ^(.*)%3F(.+)%3D(.+)$ $1?$2=$3 [R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

2 个答案:

答案 0 :(得分:1)

我最近实现了以下.htaccess代码来完成此操作 - 我已经修改它以适应您使用“完整”参数的情况。

# replace %3F with ? and %3D with =
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\%]+)\%3[Ff]full\%3[dD]([^\ ]+)\ HTTP/
RewriteRule \.*$ http://www.mywebsite.com/%1?full=%2 [R=301,L]

答案 1 :(得分:0)

尝试在处理查询字符串的规则中添加L标志:

RewriteRule ^(.*)%3F(.+)%3D(.+)$ $1?$2=$3 [L,R=301]

否则,重写的URI最终可能会被最后一条规则(RewriteRule . /index.php [L])处理,但仍然被重定向,因为URI标记为301.此外,如果原始您尝试重定向的网址在查询字符串本身中包含%3Ffull%3D1 ,那么您的规则不会与之匹配,您需要以下内容:

RewriteCond %{QUERY_STRING} ^(.*)%3Ffull%3D1(.*)$
RewriteRule ^(.*)$ $1?%1&full=%2 [L,R=301]