1

我正在尝试为 URL Rewrite 2.0 制定规则,我的内部 URL 是

http://someserver.net/in40/data/getcase.ashx?type=Good&format=json

(“in40”是一个应用程序)

我需要以下 URL 才能工作

http://someserver.net/in40/data/getcase/Good?fmt=json

规则

<match url="^data/getcase/([_0-9a-z-]+)\?fmt=([_0-9a-z-]+)$" />
<action type="Rewrite" url="data/getcase.ashx?type={R:1}&amp;format={R:2}" />

不工作


但如果我\?fmt=改为/

<match url="^data/getcase/([_0-9a-z-]+)/([_0-9a-z-]+)$" />

那么以下网址可以正常工作

http://someserver.net/in40/data/getcase/Good/json 

如何制定重写规则

http://someserver.net/in40/data/getcase/Good?fmt=json
4

3 回答 3

1

问题是[_0-9a-z-]+您的正则表达式不允许Good,因为它以 upper 开头G。一种解决方案是确保ignoreCase为路径打开该选项。
第二个问题是查询字符串应该在条件而不是路径中处理。在您的情况下,它将如下所示:

<rule name="My rewrite" stopProcessing="true">
    <match url="^data/getcase/([_0-9a-z-]+)$" ignoreCase="true" />
    <conditions>
        <add input="{QUERY_STRING}" pattern="^fmt=([_0-9a-z-]+)$" />
    </conditions>
    <action type="Rewrite" url="data/getcase.ashx?type={R:1}&amp;format={C:1}" />
</rule>
于 2013-10-04T16:00:28.273 回答
1

我之前的规则定义是错误的,URL Rewrite mudule 看不到“?” 符号,因为我没有“条件”部分,我必须包含它。甚至在那之后我在规则定义中的“输入”参数 - {QUERY_STRING} 错误。当模块“看到”

<add input="{QUERY_STRING}..... 

字符串,然后它将搜索 {QUERY_STRING},它是 URL 的一部分,就在“?”之后 符号 :) 我已将 {QUERY_STRING} 替换为 {REQUEST_URI} 以匹配整个 URL 以下示例适用于我。

<rule name="Boo" stopProcessing="true">
  <match url="^(.+)" />
  <conditions>
    <add input="{REQUEST_URI}" pattern="data/getcase/([_0-9A-Za-z-]+)\?fmt=([_0-9A-Za-z-]+)$" ignoreCase="true" />
  </conditions>
  <action type="Rewrite" url="data/getcase.ashx?type={C:1}&amp;format={C:2}" appendQueryString="false" />
</rule>
于 2013-10-13T10:57:56.857 回答
0

正则表达式引擎需要在问号前面加上一个反斜杠来将其解释为文字而不是可选的量词,这就是为什么您必须对反斜杠本身进行转义:\\?这个过程称为双重转义。

在 C# 中编写正则表达式时,通常@在模式字符串前面使用符号,这样就不必双转义反斜杠。

于 2013-10-07T14:49:01.287 回答