我有一个相对简单的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上非常糟糕。
任何帮助都会很棒,谢谢!
答案 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
,这是我测试时产生的结果。