0

更新:这有效:

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 
4

4 回答 4

2

尝试将您的代码更改为:

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

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

于 2013-06-14T20:54:16.743 回答
1

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

这最终完美地工作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule (.+) /index.cfm?event=checkuri&uri=%1 [QSA]
于 2013-06-14T23:05:51.797 回答
1

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

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

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

/index.cfm?event=checkuri&uri=index.php&id=123412
于 2013-06-14T20:54:49.020 回答
1

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

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

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

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

这是如何做到这一点的。

于 2013-06-14T20:56:47.150 回答