如何将规则动态添加到 IIS 重写映射?
How to dynamically add rules to IIS rewrite map?
我正在开发的多租户应用程序要求许多重写规则是 inserted/deleted 动态的。对于 IIS,我们正在考虑使用重写映射。
如何向重写映射动态插入规则?直接操纵 webconfig.xml? IIS 会立即接受更改吗?
对于可以添加的规则数量是否有硬性限制?
或者...有更好的方法吗?
谢谢
这是我添加到本地 web.config
文件的通用规则。
<rule name="301 Redirects for ColdFusion">
<match url=".*" />
<conditions>
<add input="{ColdFusion301:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Permanent" />
</rule>
<rule name="302 Redirects for ColdFusion">
<match url=".*" />
<conditions>
<add input="{ColdFusion302:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Temporary" />
</rule>
然后您需要将临时和永久重定向规则添加到单独的 rewritemaps.config
文件中。我的起始文件看起来像这样,至少有一个 (1) key/value 规则。
<rewriteMaps>
<rewriteMap name="ColdFusion301">
<add key="/sample301" value="/" />
<add key="/old_coffee.htm" value="/coffee.htm" />
<add key="/Gifts/" value="/shop/" />
<add key="/Gifts" value="/shop/" />
</rewriteMap>
<rewriteMap name="ColdFusion302">
<add key="/sample302" value="/" />
</rewriteMap>
</rewriteMaps>
您可以使用多种方法生成此文件。我写了一个 CustomTag 来解析 XML 文件,在编辑器中显示值,然后将数据直接重写回 XML 文件。
为了让 IIS 看到更新的规则,您需要 "touch" web.config
文件的 dateLastModified。您可以使用 setFileDate UDF setFileDate("#Rootdir#web.config", Now())
.
来完成此操作
http://www.cflib.org/udf/setFileDate
function setFileDate(filename){
var newDate = Now();
if (ArrayLen(Arguments) GTE 2) { newDate = arguments[2]; }
if (not isdate(newDate)) { return false; }
else if (newDate LT '1/1/1970') { return false; }
if (not fileExists(filename)) { return false; }
newDate = DateDiff("s", DateConvert("utc2Local", "January 1 1970 00:00"), newDate) * 1000;
return CreateObject("java","java.io.File").init(JavaCast("string",filename)).setLastModified(newDate);
}
我正在开发的多租户应用程序要求许多重写规则是 inserted/deleted 动态的。对于 IIS,我们正在考虑使用重写映射。
如何向重写映射动态插入规则?直接操纵 webconfig.xml? IIS 会立即接受更改吗?
对于可以添加的规则数量是否有硬性限制?
或者...有更好的方法吗?
谢谢
这是我添加到本地 web.config
文件的通用规则。
<rule name="301 Redirects for ColdFusion">
<match url=".*" />
<conditions>
<add input="{ColdFusion301:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Permanent" />
</rule>
<rule name="302 Redirects for ColdFusion">
<match url=".*" />
<conditions>
<add input="{ColdFusion302:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Temporary" />
</rule>
然后您需要将临时和永久重定向规则添加到单独的 rewritemaps.config
文件中。我的起始文件看起来像这样,至少有一个 (1) key/value 规则。
<rewriteMaps>
<rewriteMap name="ColdFusion301">
<add key="/sample301" value="/" />
<add key="/old_coffee.htm" value="/coffee.htm" />
<add key="/Gifts/" value="/shop/" />
<add key="/Gifts" value="/shop/" />
</rewriteMap>
<rewriteMap name="ColdFusion302">
<add key="/sample302" value="/" />
</rewriteMap>
</rewriteMaps>
您可以使用多种方法生成此文件。我写了一个 CustomTag 来解析 XML 文件,在编辑器中显示值,然后将数据直接重写回 XML 文件。
为了让 IIS 看到更新的规则,您需要 "touch" web.config
文件的 dateLastModified。您可以使用 setFileDate UDF setFileDate("#Rootdir#web.config", Now())
.
http://www.cflib.org/udf/setFileDate
function setFileDate(filename){
var newDate = Now();
if (ArrayLen(Arguments) GTE 2) { newDate = arguments[2]; }
if (not isdate(newDate)) { return false; }
else if (newDate LT '1/1/1970') { return false; }
if (not fileExists(filename)) { return false; }
newDate = DateDiff("s", DateConvert("utc2Local", "January 1 1970 00:00"), newDate) * 1000;
return CreateObject("java","java.io.File").init(JavaCast("string",filename)).setLastModified(newDate);
}