如何将此URL重写为重定向页面?

时间:2012-11-08 14:19:16

标签: coldfusion url-rewriting

我在托管服务器(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重写。新网址如下所示:

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

基本上,我只是想用我的htaccess文件用“?”来指示任何请求。问号直接在一个名为redirect.cfm的coldfusion页面中。在此页面上,我将使用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

1 个答案:

答案 0 :(得分:2)

有几个原因你正在尝试不起作用。

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

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

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

考虑到所有这些,以最简单的方式来匹配/重写请求与查询字符串是:

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

%{QUERY_STRING}正在测试正则表达式(CF的CGI范围中的所有内容都可以在这里使用,还有其他一些东西 - 请参阅文档中的the Server Variables box)。

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

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

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

这两件事共同提供:

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所需的任何标志,以使其按照需要运行。