htaccess重定向有url编码字符串的问题

时间:2014-03-25 23:35:33

标签: php .htaccess

我有一个相对简单的htaccess重定向,它将所有网址重定向到一个php文件,用于处理网址,但3个特定目录除外:

Options +FollowSymLinks  
RewriteEngine On  
RewriteCond %{REQUEST_URI} !^/system [NC]
RewriteCond %{REQUEST_URI} !^/assets [NC]
RewriteCond %{REQUEST_URI} !^/downloads [NC]
RewriteRule (.*)$ ./system/page.php?url=$1

它的效果很好......差不多。对于普通字符,它工作得很好但是一旦我引入了经过网址编码的特殊字符,它似乎有点挣扎,我不知道为什么。

在page.php中,我有一行简单的代码来显示网址:

echo $_GET['url'];

以下是各种网址的回应:

mydomain.com/test -> echos "test" (which is correct)
mydomain.com/tt%23tt -> echos "tt" (the desired echo would be tt%23tt)
mydomain.com/tt%25tt -> echos "tt%tt" (the desired echo would be tt%25tt)

基本上我正在尝试获取与url中显示的字符串完全相同的字符串并让php从那里处理它但我在htaccess上非常糟糕。

任何帮助都会很棒,谢谢!

2 个答案:

答案 0 :(得分:1)

尝试匹配实际请求而不是解码的URI:

Options +FollowSymLinks  
RewriteEngine On  
RewriteCond %{REQUEST_URI} !^/system [NC]
RewriteCond %{REQUEST_URI} !^/assets [NC]
RewriteCond %{REQUEST_URI} !^/downloads [NC]
RewriteCond %{THE_REQUEST} \ /+([^\ \?]*)
RewriteRule (.*)$ ./system/page.php?url=%1 [L,B]

%{THE_REQUEST} var是请求的第一行,因此请求未被解码,那么您需要B标记,以便%不会出现问题。 t在查询字符串中解码

答案 1 :(得分:0)

来自$_GET请求的字符串会自动从网址表单中解码,但您可以使用urlencode()再次对其进行编码:

$_GET['url'] = urlencode($_GET['url']);

另外,对于你的

  

mydomain.com/tt%23tt - > echos“tt”(期望的回声将是tt%23tt)

输出tt#tt,这是我测试时产生的结果。