【问题标题】:IIS rewrite URL with extesion to clean URLIIS 用扩展名重写 URL 以清除 URL
【发布时间】:2017-01-16 22:10:27
【问题描述】:

我有以下网址:

https://blog.test.com/search.aspx

和:

https://blog.test.com/post/2017/01/BlogPostNumberOne.aspx

我想做的事: 将包含单词post 并在末尾有aspx 的URL 重写为没有扩展名的干净URL。比如:

https://blog.test.com/search.aspx

-> 没有模式匹配,什么都不做

https://blog.test.com/post/2017/01/BlogPostNumberOne.aspx

-> MATCH,重写为https://blog.test.com/post/2017/01/BlogPostNumberOne

我尝试了以下正则表达式:^(?=.*/post/)(?=.*aspx$),我的 web.config 看起来像这样:

<rule name="Redirect to clean URL" stopProcessing="true">
     <match url="^(?=.*/post/)(?=.*aspx$)" ignoreCase="true"/>
     <action type="Redirect" url="{R:1}"/>
</rule>

它根本不工作,有时它会返回 500。你知道如何正确地重写我的传入请求吗?

谢谢:)

【问题讨论】:

  • 它不起作用,因为您仅使用零宽度断言而没有在 {R:1} 替换中引用的捕获组。将正则表达式更改为url="^(.*/post/.*)\.aspx$"

标签: asp.net regex url-rewriting


【解决方案1】:

它不起作用,因为您只使用在 {R:1} 替换中引用的没有捕获组的零宽度断言。将模式更改为消耗模式:

url="^((?:.*/)?post/.*)\.aspx$"
      |               |
      |---  R : 1  ---|

regex demo

详情

  • ^ - 字符串输入开始
  • ((?:.*/)?post/.*) - 第 1 组捕获以下序列:
    • (?:.*/)? - 一个可选组,匹配除换行符之外的任何 0+ 个字符,尽可能多地匹配到最后一个 / 并包括它
    • post/ - 文字字符序列/post/(因此,字符串输入应该以post/ 或任何直到并包括/post/ 开头)
    • .* - 尽可能多的除换行符以外的任何 0+ 字符
  • \.aspx - 文字字符序列 .aspx
  • $ - 字符串输入结束。

【讨论】:

  • 它适用于其中没有“帖子”的 URL。但是当我输入blog.test.com/post/2016/12/23/Blog-Post-Number-One.aspx 时没有任何事情发生,并且没有.aspx 就不会重写它
  • 这一定是什么字符串输入传递给正则表达式引擎的问题。试试url="^((?:.*/)?post/.*)\.aspx$"。请注意,正则表达式实际上 需要 post 子路径出现在字符串中。它无法匹配其他没有 /part/ 的 URL。
  • 成功了,你能更新你的答案吗?我会用绿色复选标记标记它。感谢您的帮助
  • 是的,主机部分之后的初始/ 没有传递给正则表达式引擎,因此,.*/ 必须用可选组包裹起来,最好用作非捕获一个。
猜你喜欢
  • 2013-05-24
  • 2019-04-21
  • 1970-01-01
  • 2022-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多