6

我正在尝试将所有非子域请求重定向到 www,同时保留请求 URI。

我在我的 .htaccess 文件中使用它进行重定向:

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

但问题是,当我有这样的请求时:

example.com/search/?name=läkare

它重定向到:

www.example.com/search/?name=l%25C3%25A4kare

这是不正确的,它被编码了两次。我用这个检查它:

<?php

echo rawurlencode('läkare');//outputs l%C3%A4kare
echo "\n";
echo rawurldecode('l%25C3%25A4kare');//outputs l%C3%A4kare
echo "\n";
echo rawurldecode(rawurldecode('l%25C3%25A4kare'));//outputs läkare

为什么要对其进行两次编码,我该如何防止它这样做?我对 1 编码没问题,但 2 太多了。

4

1 回答 1

8

您的规则需要NE(无转义)重写标志。这将防止已经转义的查询字符串被双重转义:

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=302,NE]
于 2013-01-23T18:15:16.540 回答