我正在尝试为URL Rewrite 2.0制定规则 我的内部网址是
http://someserver.net/in40/data/getcase.ashx?type=Good&format=json
(“in40”是申请表)
我需要以下网址才能使用
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}&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
答案 0 :(得分:1)
问题在于,正则表达式中的[_0-9a-z-]+
不允许Good
,因为它以较高的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}&format={C:1}" />
</rule>
答案 1 :(得分:1)
我之前的规则定义错误,网址重写mudule无法看到“?”符号,因为我没有“条件”部分,我不得不包括它。甚至在那之后我在规则定义中有错误的“输入”参数 - {QUERY_STRING}。当模块“看到”
时<add input="{QUERY_STRING}.....
字符串然后它将搜索{QUERY_STRING},这是“#”之后的URL的一部分。符号:) 我已将{QUERY_STRING}替换为{REQUEST_URI}以匹配整个网址 以下示例适用于我。
<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}&format={C:2}" appendQueryString="false" />
</rule>
答案 2 :(得分:0)
正则表达式引擎需要在问号前面加一个反斜杠来将其解释为文字而不是可选的量词,这就是为什么你必须逃避反斜杠本身:\\?
这个过程叫做double -escaping。
在C#中编写正则表达式时,通常在模式字符串前面使用@
符号,这样就不必双重转义反斜杠了。