.htaccess中的Mod_rewrite - 将以index.php开头的任何内容转发给____

时间:2013-06-14 20:32:59

标签: php apache mod-rewrite

更新:此方法有效:

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

有些背景......

所以我们已经在我们的.htaccess文件中有一个catchall重定向,这是:

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

这与数据库表绑定,该表检查匹配的URI。所以,如果我们只是移动过去拥有此页面的网站:

/some-awesome-article.html

在我们的系统上,新地址是

/真棒-物品/ 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 

4 个答案:

答案 0 :(得分:2)

尝试将代码更改为:

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

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

答案 1 :(得分:1)

根据您的评论,听起来您需要在规则上使用查询字符串附加QSA标记,如下所示:

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

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

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

答案 2 :(得分:1)

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

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

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

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

Here's how to do that.

答案 3 :(得分:1)

斯文非常接近,所以我给他支票

这最终完美地运作:

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