我在托管服务器(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
答案 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所需的任何标志,以使其按照需要运行。