0

我正在接管一个 ColdFusion 应用程序,但我在重写时遇到了一些麻烦。

该站点位于 IIS7/CF9.0.1/SQL Server 堆栈上。Helicon 经理正在处理重写。

大多数 URL 都写入一个 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 处理程序,但没有运气。

4

1 回答 1

3

这不起作用的原因是因为 RewriteRule 永远不会看到查询字符串,只会看到资源的路径。要访问查询字符串,您需要使用重写条件

RewriteEngine on
RewriteBase /

RewriteCond %{QUERY_STRING}            ^(.*)$
RewriteRule ^([^\.]+)\.html$           default.cfm?name=$1.html&%1 [NC,L]

在此示例中,我们只是检查查询字符串并使用%1这意味着 this 中的第一组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/ 。它们很容易添加书签。

我希望这会有所帮助。

于 2012-04-16T05:29:06.273 回答