更新:此方法有效:
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
答案 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编码。
答案 3 :(得分:1)
斯文非常接近,所以我给他支票
这最终完美地运作:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule (.+) /index.cfm?event=checkuri&uri=%1 [QSA]