我正在尝试将IIS URL重写与ASP.Net 4.5 Web窗体站点中用于子域和子目录的路由结合起来。
我正在尝试将IIS中的URL重写与ASP.Net 4.5中的“路由”结合在一起用于一个Webforms站点。我现在拥有的解决方案非常适合用于重写带有可选参数的子域的路由值,但是我正在努力将子目录URL传递给路由或查询字符串。我正在使用的大多数参数也是可选的,因此规则必须考虑这些参数的任何组合或什么都不做。
最终目标是一种羽毛效果,连字符在子域侧和类别在子目录侧均分开。例如,包含所有参数的URL类似于http://city-state.example.com/categoryslug/subcategoryslug
我在web.config中为子域设置的规则以及我在RouteConfig.cs中具有的路由如下:
<rewrite>
<rules>
<rule name="Rewrite subdomains">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(^$|[^\-]*)(^$|[\-]?)([^\-]\w)\.example\.net$" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="{ToLower:/local/{C:3}/{C:1}}" />
</rule>
</rules>
<outboundRules>
<rule name="RewriteRelativePaths" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^/(.*)" negate="false" />
<action type="Rewrite" value="http://example.net/{R:1}" />
</rule>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
From RouteConfig.cs
// Geographic SubDomains
routes.MapPageRoute("local/state", "local/{state}", "~/local/Default.aspx");
routes.MapPageRoute("local/state/city", "local/{state}/{city}", "~/local/Default.aspx");
Potential Conflicting routes:
//Category
routes.MapPageRoute("category", "{catslug}", "~/category/Default.aspx");
//SubCategory
routes.MapPageRoute("category/subcategory", "{catslug}/{scatslug}", "~/category/Default.aspx");
最终的预期结果应该将类似http://city-state.example.com/categoryslug/subcategoryslug的内容重写为〜/ local / {state} / {city} / {categoryslug} / {subcategoryslug},但我发现该路线与〜/ local之类的内容之间可能存在冲突/ {state} / {categoryslug},我认为应用程序无法区分州/类别和州/城市。
我对于类别/子类别也有一些潜在的冲突路线,其中根域使用子弹显示类别。我担心的是,包含相同类别/子类别模式的路由可能最终被发送到根域而不是子域。
由于上述问题,我认为对类别使用查询字符串比使用路由更好。现在,我可以在http://city-state.example.com/?category=categoryslug&subcategory=subcategoryslug加载页面了。接下来,我希望能够将那些查询字符串更改为categoryslug / subcategoryslug并将其重写为/ local / {state} / {city} /?categoryslug = categoryslug&subcategoryslug = subcategoryslug。我不希望将该URL重写为?category =&subcategory =之类的内容,因为这与页面如何基于查询字符串选择数据不兼容。
<rule name="Rewrite subdomains">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(^$|[^\-]*)(^$|[\-]?)([^\-]\w)\.example\.com$" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="{ToLower:/local/{C:3}{C:2}{C:1}{PATH_INFO}}" appendQueryString="true" />
</rule>
</rules>
<outboundRules>
<rule name="RewriteRelativePaths" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^/(.*)" negate="false" />
<action type="Rewrite" value="http://example.com/{R:1}" />
</rule>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>