需要 .htaccess RewriteRule

.htaccess RewriteRule needed

我正试图捕捉旧的 URL 的形式:

http://www.example.com/mpn_engine.php%3Ffamilyname%3Djiyalal+goswami%26menuopt%3D2%26submenuopt%3D1%26Search%3Dstuff

在我的 .htaccess 文件中,在各种明智的 Whosebugers 的帮助下,因为 RegEx 对我来说是陌生的,我已经安排了捕获 PHP 脚本 'mpn_engine.php'(两者都是 .php3和较新的 .php 份)在任何可能找到的地方(在任何子文件夹中)并将访问者重定向到索引页面。

RewriteRule (^|/)mpn_engine\.php$ /index.html? [L,NC,R=301]
RewriteRule (^|/)mpn_engine\.php3$ /index.html? [L,NC,R=301]

我发现的奇怪的事情是,如果我准确地寻找 php 文件,或者如果我提供以下形式的常规参数,上述内容似乎可以工作:

http://www.example.com/lang/mpn_engine.php?x=fred

但是一旦我用百分号代替问号,即如下所示:

 http://www.example.com/lang/mpn_engine.php%x=fred

重写失败,& 我得到了不可预测的结果,通常是 404,但偶尔是 'Bad Gateway'。

我如何重写此 ReWriteRule 以在可能会查找的任何文件夹中捕获此 .php 文件以及任何尾随字符(包括百分号),并将其优雅地重定向到索引页面?

谢谢!

您的问题有多个子问题:

  1. 如果你想在任何文件夹中“捕获这个 .php 文件,它可能是 寻找”那么只要您的 .htaccess 文件在您网站的根文件夹中(而不是在子文件夹中),那么您就被覆盖了。
  2. 如果您想覆盖任何尾随字符,那么您可以对重写规则进行以下两项更改之一:

    删除结尾的$:

    RewriteRule (^|/)mpn_engine\.php /index.html? [L,NC,R=301]

    在"php"后加一个通配符:

    RewriteRule (^|/)mpn_engine\.php(.*)$ /index.html? [L,NC,R=301]

    在第一种情况下,如果 $ 存在,这会告诉 Apache 仅在 "php" 位于 URL 的末尾时才匹配。在第二种情况下,如果 "php" 后跟 URL 末尾的零个或多个任何其他字符,这会告诉 Apache 进行匹配。在任何一种情况下,您都不需要关于 "php3" 的第二个重写规则——以上任何一个都将匹配那些实例。

  3. 您的第一个带有“%”的示例成功但随后的尝试出现 404 错误的原因是服务器将“%3F”转换为“?”和“?” has a special meaning 用于 Web 服务器,基本上会被您的正则表达式匹配器忽略——因此服务器的行为就好像 "php" 是 URL 的最后一部分,并且重写成功。