我的web.config文件中有一个重写规则,如下所示:
<rule name="Public page" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{URL}" pattern="\.(.*)$" negate="true" />
</conditions>
<action type="Rewrite" url="public/place/{R:2}.aspx?cname={R:1}" />
</rule>
它的作用是让客户输入动态地名,然后输入他想要查看的页面。例如,我有一个页面显示公司的新闻。我想看一家名为“Pavilion”的公司的新闻,所以我打字:
http://localhost/pavilion/news/
并且URL重写将我带到
http://localhost/public/news.aspx?cname=pavilion
有效。但是我遇到了很多关于这样的情况没有找到的页面的错误:图像的src属性指向另一个页面中的某些非现有名称。 例如,在产品页面(http://localhost/products/showproducts.aspx)中我有:
<img src='undefined'/>
当我调试时,我发现它触发规则,认为产品是{R:2}而未定义是{R:1}
所以它会尝试加载http://localhost/products/undefined/
并收到错误:The file '/public/undefined.aspx' does not exist.
如果网址的第一段是目录或文件,我希望规则不要触发。 有没有人知道如何进行这样的检查?
答案 0 :(得分:0)
答案是在条件输入字符串中使用反向引用。
<rule name="Public page" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{URL}" pattern="\.(.*)$" negate="true" />
<add input="{DOCUMENT_ROOT}\{R:1}" matchType="IsFile" negate="true" />
<add input="{DOCUMENT_ROOT}\{R:1}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="public/place/{R:2}.aspx?cname={R:1}" />
</rule>
感谢Leo的回答