1

我们的大部分页面都是通过查询字符串访问的,所以我们的 URL 如下所示:

http://www.example.com/?var=val&var2=val2

我发现在网络上的某个地方,有人通过以下链接链接回我们:

http://www.example.com/%3Fvar%3Dval%26var2%3Dval2

我发现一大块代码要添加到我的 .htaccess 文件中,但它确实减慢了我的页面请求。我想要的是在文件名的开头捕获那个“%”并将其重定向到一个 php 文件,我可以将它解析为查询字符串并 301 重定向它。

我有一种感觉,如果我知道我在做什么,这实际上将是一件非常容易的事情。假设我的 php 文件将被称为 percent_fix.php

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

4

4 回答 4

1

尝试为您的链接提供默认页面。例如 index.php

然后添加到您的 .htaccess

# for %3f ...
RewriteRule ^/index.php\?(.*)$ /index.php?$1
于 2016-12-15T15:46:27.897 回答
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 中(或者如果在 httpd.conf 中没有任何“Virtualhost”,则使用主服务器配置)。

于 2016-02-02T13:57:27.850 回答
-1

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

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php$1 [L,NC]
于 2012-11-02T13:54:50.730 回答
-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();
  }
?>
于 2012-11-02T17:01:34.530 回答