【问题标题】:Mod_rewrite in .htaccess - forward anything that starts with index.php to ____.htaccess 中的 Mod_rewrite - 将任何以 index.php 开头的内容转发到 ____
【发布时间】:2013-06-11 14:16:15
【问题描述】:

更新:这可行:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule (.+) /index.cfm?event=checkuri&uri=%1 [QSA]

一些背景...

所以我们已经在我们的 .htaccess 文件中有一个包罗万象的重定向:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.+) /index.cfm?event=checkuri&uri=$1 

这与检查 URI 是否匹配的数据库表相关联。所以如果我们只是移动了一个曾经有这个页面的网站:

/some-awesome-article.html

进入我们的系统,新地址是

/awesome-article/12442

有人试图访问旧的 URI,我们的系统会检查这个,找到一个匹配,然后将他们转发到新的主页:/awesome-article/12442


这个系统非常棒,但有一个例外。如果 URI 类似于 /index.php?id=123412,那么整个系统就会崩溃。事实上 /index.php/whatever 也不起作用。

除此之外,其他一切都有效。我们不将 PHP 用于我们的 Web 应用程序(尽管支持人员在服务器某处的管理控制台中说它)。


所以基本上我需要的是,如果在任何地方检测到 index.php,它将把 URI 转发到我们的 现有系统:

我该如何修改它来修复它?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.+) /index.cfm?event=checkuri&uri=$1 

【问题讨论】:

  • 是您试图将原始查询字符串(在您的示例中为id=123412)作为附加参数传递给 index.cfm 的问题吗?
  • 迈克,我认为你很接近。在测试这个 IS 工作但他们查询字符串没有通过。所以 index.php 本身确实有效。但是一旦你添加了查询字符串参数,它就会失败所以看起来我们需要做的就是改变这个: RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.+) /index.cfm?event=checkuri&uri=$1 to ALSO pass沿着查询参数。不知道到底是怎么回事。

标签: php apache mod-rewrite


【解决方案1】:

尝试将您的代码更改为:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.+) /index.cfm?event=checkuri&uri=$1 [L,QSA]

QSA 用于查询字符串追加,确保将现有查询参数附加到新参数。

【讨论】:

  • 好的,这是一个改进,查询参数没有通过,但是有没有办法可以将它们作为单个字符串读取?因此,例如,如果原始 URI 是:在此处转发:/index.cfm?event=checkuri&uri=/index.phpid=1234&color=blue&font=arial 并且我无法读取颜色、id 和字体查询参数 - 但是我不知道原来的顺序。有没有办法以某种方式通过整个事情?
  • 抱歉您的评论被截断了。您要按原样传递的原始 URL 是什么?
【解决方案2】:

使用 mod_rewrite 重写不适用于完整的 URL。实际上,RewriteRule 中的正则表达式确实只获取路径和文件,而没有获取查询字符串。所以反向引用$1 将只包含“index.php”而不包含其他内容。

此外,RewriteRule 确实会更改查询字符串,因为目标模式中有一个。因为标志[QSA](查询字符串追加)不存在,原始请求的查询字符串被替换而不是追加。所以重写后查询字符串就消失了。

如果您不弄乱查询字符串,这会容易得多。重写任何不是现有文件的 url 的最简单方法是,如果第二行只是 RewriteRule (.+) /index.cfm - 然后您可以在脚本中获取有关当前请求的所有信息,包括查询字符串、路径和文件。

所以现在你必须摆弄查询字符串。添加[QSA] 会将查询字符串传递给您的脚本,您必须检测其中的内容。仅当您不希望查询字符串包含名为“event”和“uri”的参数时,这才有效 - 这些将被您的重写覆盖。如果需要将原始查询字符串添加到 URL 中,则有点复杂,因为字符串需要进行 url 编码。

Here's how to do that.

【讨论】:

  • 这听起来很接近。 (链接)。我将如何更改我的重写规则语法以传递整个 uri(编码与否)
  • %1 是对 RewriteCond 中正则表达式的反向引用,%{THE_REQUEST} 是包含请求的变量。
  • 好吧,我们真的很接近了:这行得通:RewriteCond %{THE_REQUEST} !-f RewriteRule (.+) /index.cfm?event=checkuri&uri=$1 [L,QSA] 但是任何对静态内容现在被卷入其中。因此图像和 css 文件将不会加载。如何解决...
  • THE_REQUEST 和 REQUEST_FILENAME 之间存在差异。后者是文件系统上的文件名,RewriteCond 中的检查是!-f,即“如果不是真实文件”。如果您将 REQUEST_FILENAME 更改为 THE_REQUEST,此检查将不再找到任何真实文件。把它留在原地。在检查整个字符串并允许将其用作 %1 之后添加一个始终为 true 的 RewriteCond。
【解决方案3】:

根据您的 cmets,听起来您需要在规则上使用 Query String Append QSA 标志,如下所示:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cfm?event=checkuri&uri=$1 [QSA,L]

在您的示例情况下,重写将如下所示:

/index.cfm?event=checkuri&uri=index.php&id=123412

【讨论】:

  • 除了更改 ?到 & 会使我们的 URI 字符串检查器失败
  • @JeffGladnick 您需要修改 URI 字符串检查器,因为就 Apache 而言,URI 和查询字符串是两个完全独立的实体。
【解决方案4】:

Sven 很亲近,所以我要给他支票

这最终完美地工作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule (.+) /index.cfm?event=checkuri&uri=%1 [QSA]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多