繁体   English   中英

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

[英]Mod_rewrite in .htaccess - forward anything that starts with index.php to ____

更新:这有效:

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

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

/真棒-文/ 12442

并且有人尝试访问旧的URI,我们的系统会检查该内容,找到匹配项并将其转发到新的首页:/ awesome-article / 12442


这个系统很棒,除了一个例外。 如果URI是/index.php?id=123412之类的东西,那么整个系统就会崩溃。 实际上,/ index.php /无论如何都不起作用。

除此之外,其他所有方法都起作用。 我们不将PHP用于我们的Web应用程序(尽管支持说它在服务器上某个地方的管理控制台中)。


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

我该如何修改以解决此问题?

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

尝试将代码更改为:

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

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

根据您的评论,听起来您需要像这样在规则上使用“查询字符串附加QSA标志:

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

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

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

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

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

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

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

这是这样做的方法。

斯文很近,所以我给他支票

最终效果完美:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM