我正在接管一个ColdFusion应用程序,我在重写方面遇到了一些麻烦。
该站点位于IIS7 / CF9.0.1 / SQL Server堆栈上。 Helicon经理正在处理重写。
大多数网址都写入html文件,所以我们有类似/profile.html
的内容此行重写了URL:
RewriteRule /([^\?]*?)\.(html)(\??)(.*)? /default.cfm?name=$1.$2&$4 [I]
当出现像/view.html?id=123这样的查询字符串时会出现问题。查询字符串应由$ 4变量写入,但是当我像这样转储URL时,我永远不会在应用程序中获得任何内容:
<cfset objRequest = GetPageContext().GetRequest() />
<cfset strUrl = objRequest.GetRequestUrl().Append(
"?" & objRequest.GetQueryString()
).ToString()
/>
<cfoutput>#strUrl#</cfoutput>
我得到的结果是:http://10.211.55.6/default.cfm?name=view.html&。查询字符串永远不会显示。
我相信这是一个IIS设置 - 允许.html处理程序访问GET变量吗?我已经设置了一个.html处理程序,但没有运气。
答案 0 :(得分:3)
这不起作用的原因是因为RewriteRule永远不会看到查询字符串,只看到资源的路径。要访问查询字符串,您需要使用重写条件
RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^\.]+)\.html$ default.cfm?name=$1.html&%1 [NC,L]
在这个示例中,我们只是检查查询字符串并使用%1
,这意味着RewriteCond
中的第一个组在您的示例中是过度的,您不需要匹配任何内容,因此您可以这样做: -
RewriteEngine on
RewriteBase /
RewriteRule ^([^\.]+)\.html$ default.cfm?name=$1.html&%{QUERY_STRING} [NC,L]
然而,聪明的方法就是使用正确的标志来做你想要做的事情QSA
,这意味着查询字符串附加如下: -
RewriteEngine on
RewriteBase /
RewriteRule ^([^\.]+)\.html$ default.cfm?name=$1.html [NC,QSA,L]
Helicon的ISAPI重写的所有文档都可以在这里找到:http://www.helicontech.com/isapi_rewrite/doc/。加入书签非常方便。
我希望有所帮助。