如何重写%3f到?在阿帕奇

时间:2012-11-02 13:40:32

标签: apache mod-rewrite

我们的大多数页面都是通过查询字符串访问的,因此我们的网址如下所示:

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重写条件和规则。)

4 个答案:

答案 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();
  }
?>