0

我在托管服务器 (Hostek.com) 上使用 Microsoft-IIS/7.5

我有一个现有的网站,在 Google 中有 2,820 个索引链接。您可以通过以下方式在 Google 上搜索查看结果:site:flyingpiston.com 大多数页面都使用 section、makerid 或 bikeid 来获取正确的信息。大多数链接如下所示:

flyingpiston.com/?BikeID=1068
flyingpiston.com/?MakerID=1441
flyingpiston.com/?Section=Maker&MakerID=1441
flyingpiston.com/?Section=Bike&BikeID=1234

在新站点上,我正在使用 .htaccess 进行 URL 重写。新的 URL 将如下所示:

flyingpiston.com/bike/1068/
flyingpiston.com/maker/1123/

基本上,我只想使用我的 htaccess 文件来引导任何带有“?”的请求。问号直接在它的coldfusion页面中调用redirect.cfm。在此页面上,我将使用 ColdFusion 编写自定义 301 重定向。ColdFusion 的重定向如下所示:

<cfheader statuscode="301" statustext="Moved Permanently">
<cfheader name="Location" value="http://www.newurl/bike/1233/">
<cfabort>

那么,如果我想将带有问号的所有内容推送到特定页面,我的 htaccess 文件需要看起来像什么?这是我尝试过的,但它不起作用。

RewriteEngine on
RewriteRule ^? /redirect.cfm [NS,L]

更新。使用下面的建议,我正在使用这个规则:

RewriteRule \? /redirect/redirect.cfm [NS,L]

尝试推送此请求

http://flyingpiston2012-com.securec37.ezhostingserver.com/?bikeid=1235

到这个页面:

http://flyingpiston2012-com.securec37.ezhostingserver.com/redirect/redirect.cfm
4

1 回答 1

2

您尝试的方法不起作用有几个原因。

第一个是 RewriteRule 使用正则表达式,并且?是正则表达式元字符,因此需要使用反斜杠 ( \?) 对其进行转义以告诉它匹配文字问号字符。

但是,问题的第二部分是RewriteRule的正则表达式仅针对 URL 的文件名部分进行测试 - 它专门排除了查询字符串

为了匹配查询字符串,您需要使用RewriteCond指令,放置在规则之前的行(但应用RewriteRule 匹配和替换之间),充当附加过滤器。有用的一点是您可以指定要匹配的 URL 的哪一部分(以及使用非正则表达式测试的选项)。

考虑到这一切,使用查询字符串匹配/重写请求的最简单方法是:

RewriteCond %{QUERY_STRING} .
RewriteRule .* /redirect/redirect.cfm

%{QUERY_STRING}是正则表达式的测试对象(CF 的 CGI 范围内的所有内容都可以在这里使用,也可以使用其他一些东西 - 请参阅文档中的服务器变量框)。

单曲.只是说“确保匹配的项目有任何单个字符”

目前,此规则将保留现有的查询字符串 - 如果您想丢弃它,您可以将 a?放在替换 URL 的末尾。(如果您需要在 URL 上使用查询字符串而不丢弃旧版本,请使用该[QSA]标志。)

在相反的方向,您将丢失 URL 的文件名部分 - 为了保留它,您可能希望使用自动整体匹配捕获将其作为 PATH_INFO 附加到替换部分$0

这两件事一起提供:

RewriteCond %{QUERY_STRING} .
RewriteRule .* /redirect/redirect.cfm/$0?

最后一件事是你要防止无限循环——上面的规则去掉了查询字符串,所以它总是会失败 RewriteCond,但最好是安全的(特别是如果你可能需要添加一个查询字符串),你可以使用额外的 RewriteCond:

RewriteCond %{QUERY_STRING} .
RewriteCond %{REQUEST_URI} !/redirect/redirect\.cfm
RewriteRule .* /redirect/redirect.cfm/$0?

多个 RewriteCond 组合为 AND,并且!否定匹配。

您当然可以将所需的任何标志添加到 RewriteRule 以使其按需要运行。

于 2012-11-08T15:12:17.950 回答