检查URL的第一段是否不是文件或目录

时间:2012-03-12 10:31:22

标签: c# url-rewriting urlrewriter.net

我的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.

如果网址的第一段是目录或文件,我希望规则不要触发。 有没有人知道如何进行这样的检查?

1 个答案:

答案 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的回答