.htaccess RewriteRule需要

时间:2015-03-16 04:52:54

标签: php .htaccess mod-rewrite redirect

我正在尝试捕获以下形式的旧网址:

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

在我的.htaccess文件中,在各种明智的StackOverflowers的帮助下,由于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,但偶尔会有一个糟糕的网关#。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您的问题有很多子问题:

  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]

    在第一种情况下,如果$ present,这告诉Apache只有匹配,如果" php"位于URL的末尾。在第二种情况下,这告诉Apache匹配if" php"后面是URL末尾的零个或多个任何其他字符。在任何一种情况下,你都不需要你的第二次重写规则" php3" - 上述任何一个都将匹配这些实例。

  3. 您使用"%"的第一个示例的原因虽然工作但后续尝试给404错误是因为服务器翻译"%3F"到"?"和"?" has a special meaning用于Web服务器,并且基本上被正则表达式匹配器忽略 - 因此服务器就好像" php"是URL的最后一部分,重写成功。