Apache 如何将%3f重新写入?在阿帕奇

Apache 如何将%3f重新写入?在阿帕奇,apache,mod-rewrite,Apache,Mod Rewrite,我们的大多数页面都是通过查询字符串访问的,因此我们的URL如下所示: 我发现在网络上的某个地方,有人用如下链接与我们链接: 我发现有一大块内容需要添加到.htaccess文件中,但这确实降低了我的页面请求速度。我想要的是在文件名的开头捕捉到%并将其重定向到一个php文件,在那里我可以将其解析为一个查询字符串并对其进行301重定向 我有一种感觉,如果我知道我在做什么,这将是一件非常容易的事情。让我们假设我的php文件将被称为percent_fix.php <?php if($_SERVER[

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

我发现在网络上的某个地方,有人用如下链接与我们链接:

我发现有一大块内容需要添加到.htaccess文件中,但这确实降低了我的页面请求速度。我想要的是在文件名的开头捕捉到%并将其重定向到一个php文件,在那里我可以将其解析为一个查询字符串并对其进行301重定向

我有一种感觉,如果我知道我在做什么,这将是一件非常容易的事情。让我们假设我的php文件将被称为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();
  }
?>

我确信我可以编写php,我只需要有关.htaccess重写条件和规则的帮助。

在.htaccess文件中尝试以下操作:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php$1 [L,NC]

我回到了我的问题中包含的链接,并意识到该线程顶部附近的简单案例实际上满足了我的需要。 以下是对我有效的方法:

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

您几乎肯定会遇到403错误。 这个错误是因为什么原因引起的?是Windows和Linux上禁用的文件/目录名称字符。这意味着当Apache试图在解码后查找名为/document/root/index.php的文件或目录时,会导致403错误。这是在读取.htaccess文件之前,因此不能在.htaccess文件中使用mod_rewrite来覆盖此403错误或在.htaccess文件中定义的ErrorDocument来捕获此错误


捕获%3f的唯一方法是在虚拟主机(如httpd-vhosts.conf)或主服务器配置(如httpd.conf)中使用mod_rewrite或ErrorDocument。如果没有任何虚拟主机(如httpd.conf),请尝试为链接提供默认页面。e、 g.index.php

然后添加到您的.htaccess

# for %3f ...
RewriteRule ^/index.php\?(.*)$ /index.php?$1

您可能需要使用\%而不是%as%{xxx}意味着apache变量xxxI已按编写方式尝试并尝试\%。两个人都没干。然后,我在规则之前尝试了RewriteCond%{REQUEST_FILENAME}^[%]的变体,但无法使其工作。我已经用mod_rewrite日志设置了我的机器,并将我的答案更改为一个适用于me@TecBrat:我已审阅并拒绝了您建议的对此答案的编辑。如果你想回答自己的问题,请随意回答。但不要对其他人的答案进行如此重大的编辑…日志表明apache已将url解码为?var=val&var2=val2,因此检查%将失败。我这样做:RewriteRule^/*\?.$/$1?$2[R,L]