我们的大多数页面都是通过查询字符串访问的,因此我们的网址如下所示:
http://www.example.com/?var=val&var2=val2
我发现在网络的某个地方,有人通过这样的链接链接回我们:
http://www.example.com/%3Fvar%3Dval%26var2%3Dval2
我发现了一大块code要添加到我的.htaccess文件中,但它确实减慢了我的页面请求速度。我想要的是在文件名的开头捕获“%”并将其重定向到php文件,我可以将其解析为查询字符串并将其重定向。
我有一种感觉,如果我知道我在做什么,这实际上是一件非常容易的事情。我们假设我的php文件名为percent_fix.php
(我确信我可以写php,我只需要帮助.htaccess重写条件和规则。)
答案 0 :(得分:1)
尝试将默认页面提供给您的链接。例如的index.php
然后添加到.htaccess
# for %3f ...
RewriteRule ^/index.php\?(.*)$ /index.php?$1
答案 1 :(得分:0)
您几乎肯定会收到403错误。 这个错误是因为?是Windows和Linux上的禁止文件/目录名称字符。这意味着当Apache尝试查找名为" /document/root/index.php?blah"的文件或目录时(解码后),它会导致403错误。这是在读取.htaccess文件之前,因此您无法在.htaccess文件中使用mod_rewrite来覆盖此403错误或.htaccess文件中定义的ErrorDocument以捕获此错误。
捕获%3f的唯一方法是在" VirtualHost" 中使用mod_rewrite或ErrorDocument,例如在httpd-vhosts.conf中(或主服务器配置,如果没有" Virtualhost"例如在httpd.conf中)。
答案 2 :(得分:-1)
在.htaccess文件中尝试以下操作:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php$1 [L,NC]
答案 3 :(得分:-1)
我回到了我在问题中包含的链接,并意识到靠近该线程顶部的简单案例实际上是我需要的。 这是实际对我有用的:
#in .htaccess
RewriteEngine on
# If an encoded "?" is present in the requested URI, and no unencoded "?" is
# present, then externally redirect to replace the encoded "?" character.
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]+)\ HTTP/
RewriteCond %1 ^(([^%]*(\%(25)*([^3].|.[^F]))*)*)\%(25)*3F(.*)$ [NC]
RewriteRule ^. http://www.example.com/percent_fix.php?%7 [NE,R=301,L]
然后在percent_fix.php
<?php
if($_SERVER['QUERY_STRING'])
{
$new_query=urldecode($_SERVER['QUERY_STRING']);
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com/?'.$new_query);
die();
}
else
{
header('HTTP/1.x 404 Not Found');
//readfile("http://www.example.com/?page=404_error");
die();
}
?>