0

我正在尝试创建一个规则,它将从 URL 中获取子文件夹并将其转换为查询字符串值,例如:

如果我导航到此 URL:http://www.example.com/myfolder 我希望阅读http://www.example.com/default.aspx?folder=myfolder

这就是我要做的事情:

<rule name="Rewrite Language">
  <match url="([a-z]{2})(.*)" />
  <conditions logicalGrouping="MatchAll">
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
  </conditions>
  <action type="Rewrite" url="/default.aspx?code={R:2}" />
</rule>

但这不会返回完整的子文件夹值。老实说,我从这个网站的一个类似问题中偷了这个,我必须承认我真的不知道这一切意味着什么!

我可能以错误的方式处理此问题,我的问题是我无法确定子文件夹将是什么,因为它是从随机的 6 个字符字母数字值动态生成的。

任何帮助将不胜感激。

大卫

4

1 回答 1

2

IIS 管理器有一个用于创建规则的 GUI / 向导界面,我通常发现它比手动将规则输入到 web.config 文件中更快、更容易。值得一试:IIS Manager -> select your site / application -> URL Rewrite -> Add Rule(s)

我认为以下规则会为您解决问题:

<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
    <match url="^([^/]+)/?$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="default.aspx?folder={R:1}" />
</rule>

基本上,“匹配 url”是一个正则表达式,用于识别 URL 的一部分。在这种情况下,它会捕获一个包含一个或多个字符(/ 除外)的组,在 URL 的末尾带有一个可选的 /。然后它将重写 urldefault.aspx?folder=后跟匹配的值({R:1}指第一个捕获的组,其中将包含文件夹名称)。

如果您只有一个子文件夹名称(不是嵌套文件夹),这将起作用。

您还可以添加第二条在相反方向起作用的规则,因此浏览到http://www.example.com/default.aspx?folder=myfolder会导致用户看到http://www.example.com/myfolder

<rule name="RedirectUserFriendlyURL1" stopProcessing="true">
    <match url="^default\.aspx$" />
    <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
        <add input="{QUERY_STRING}" pattern="^folder=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="{C:1}" appendQueryString="false" />
</rule>
于 2013-01-16T21:20:04.210 回答