URL 重写有点模棱两可。您是否正在重写用户看到的内容?或者服务器看到了什么?最好相信您无法更改 URL 向网站消费者显示的内容。
但是,诀窍是将它们发送到一个损坏的、非真实的 URL……然后为你重写 URL,这样你就知道那个非真实的 URL 意味着什么。例如:
假设你有一个像这样的真实 URL:
http://www.example.com/folder/subfolder/page.ext?param=value
但您想“重写” URL 使其看起来像这样:
http://www.example.com/subfolder/value
如果他们在页面 page.ext... 上,您无法更改他们在 URL 栏中看到的内容。但是,您可以将它们重定向到虚假路径 /subfolder/value,如下所示:
<rule name="subFolder Value Redirect">
<conditions>
<add input="{REQUEST_URI}" pattern="^/folder/([^/]+)/page\.ext\?param=([^&]+)$" />
</conditions>
<action type="Redirect" url="/{C:1}/{C:2}" />
</rule>
上面,我没有做“url 匹配”,因为我完全依赖于一个条件。我唯一的条件是 Request_URI 看起来完全符合我的预期。某个文件夹、某个子文件夹名称、page.ext 和一个 param=SomeValue 的查询字符串。我使用() 括号来动态捕获子文件夹名称和参数值。
注意:{C:0} 表示条件的“第 0 个”捕获组。 Capture 0 是正则表达式^/folder/([^/]+)/page\.ext\?param=([^&]+)$ 的整个结果。 Capture 1 是第一个捕获组,即子文件夹名称。 Capture 2 是第二个 Capture Group,即参数值。
^ 在正则表达式开头的意思是“从头开始”。有时你不想从头开始,那样就不会在那里。
$ 在正则表达式末尾的意思是“在末尾结束”。有时你不想在最后结束,那也不会有。
字符类[^...] 意味着捕获任何不是... 的字符。在这种情况下,捕获任何不是 Slash 或任何不是 & 符号的东西。
重复运算符[...]+Plus-Symbol 表示至少捕获前面的规则一次,但最多捕获多次。
. 是一个特殊字符,意思是“任何东西”。但我们的意思是扩展名page.ext 的点。所以你像\.一样逃避它
{REQUEST_URI} 表示将您的模式与域/端口之后的整个 URL 进行比较。所以在 URL http://www.example.com:1234/subfolder... 的 /subfolder 和所有以下内容都在 {REQUEST_URI} EXCEPT 标签路由中。因此,如果您有 Anchor 或 Angular UI Route,它们只保留在浏览器中,并且始终位于任何重定向的末尾,但服务器永远不会看到它们,因此您无法解析主题标签。
action type="Redirect" 仅表示此操作是将用户重定向到给定 URL。
url="/{C:1}/{C:2}" 是相对于域的 URL,因为它不以协议开头。这将重定向到 /subFolder/value,因为我们的模式中的条件捕获 1 和条件捕获 2 捕获了这两个值。
插入此规则后,用户将被重定向到看起来像状态代表 URL (RESTful) 的损坏的 janked URL。 耶!!
网址重写
重写是为您(服务器),而不是为客户。但是现在它们被重定向到一个漂亮的非常损坏的 URL,您可以找到该 URL 的上下文,并通过为服务器重写它来告诉您的服务器它的真正含义。
<rule name="subFolder Value Rewrite">
<conditions><add input="{REQUEST_URI}" pattern="^/([^/]+)/([a-zA-Z0-9]+)$" /></conditions>
<action type="Rewrite" url="/folder/{C:1}/page.ext?param={C:2}" />
</rule>
这几乎与先前的规则相反。这会找到一个模式,其中有一个路径“subFolder”名称、斜杠和一个由字母和数字组成的值。它还再次描述了 Begginning ^ 和 End $,因为我们不会期待意想不到的奇怪事情。因此,这将捕获如下 URL:
http://www.example.com/subFolder/1234abcDE
但不会抓到
http://www.example.com/lol/somethingelse/15?blah=kthx
然后,重写 URL 会返回一个真正的真实 URL,该 URL 映射到用于处理真实存在的文件的路径。而且,请记住,“重写”意味着它采用用户看到的“不正确”假值,并将其重写回服务器的丑陋“正确”值。反之亦然。