IIS Url-重写:URL 不会被识别
IIS Url-Rewrite: URL won't get recognized
我正面临 URL-Rewrite 模块的问题。
我想达到的目标:
我现在有一个地址为 "test-server" 的网站。当输入 URL 时,我想通过 {HTTP_ACCEPT_LANGUAGE} 变量将 URL 更改为 "test-server/de" 或 "test-server/en"。
这应该只适用于 URL "test-server" 所以当用户在像 "test-server/de/" 这样的子页面上时,他可以手动将 URL 更改为 "test-server/en/" 而无需获取再次重定向。
这是我所知道的:
<rewrite>
<rules>
<rule name="ToGermanPage" enabled="true" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^de" />
<add input="{URL}" pattern=".+test-server" />
</conditions>
<action type="Redirect" url="{R:0}/{HTTP_ACCEPT_LANGUAGE}" appendQueryString="true" />
</rule>
<rule name="ToEnglishPage" enabled="true" stopProcessing="true">
<match url="^test-server" />
<action type="Redirect" url="http://test-server/en" />
<conditions logicalGrouping="MatchAny" trackAllCaptures="false">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^de" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
我的问题是,如果我输入以下内容:
它不会识别 URL,条件中的 {URL} 参数也是如此。
看这条规则...
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^de" />
<add input="{URL}" pattern=".+test-server" />
</conditions>
<action type="Redirect" url="{R:0}/{HTTP_ACCEPT_LANGUAGE}" appendQueryString="true" />
match url
是.*
,会匹配所有资源。如果您只希望重定向适用于 http(s)://test-server/
,您应该指定一个空白资源 (url="^$"
)。
您可以使用 {HTTP_HOST}
而不是 {URL}
来匹配您的主机名(无需担心 http/https
)。
此外,您的重定向 URL 使用 {R:0}
,即 match/resource URL。对于 http://test-server
,match URL 为空,因为未指定资源路径。不过,您应该能够从重定向 URL 中完全删除 {R:0}
,因为您只需要重定向到 de
或 en
。所以,尝试这样的事情:
<match url="^$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^test-server$" />
</conditions>
<action type="Redirect" url="{HTTP_ACCEPT_LANGUAGE}" appendQueryString="true" />
应该匹配 http(s)://test-server
并重定向到:
http(s)://test-server/en
或
http(s)://test-server/de
取决于 {HTTP_ACCEPT_LANGUAGE}
的值。
我正面临 URL-Rewrite 模块的问题。
我想达到的目标: 我现在有一个地址为 "test-server" 的网站。当输入 URL 时,我想通过 {HTTP_ACCEPT_LANGUAGE} 变量将 URL 更改为 "test-server/de" 或 "test-server/en"。 这应该只适用于 URL "test-server" 所以当用户在像 "test-server/de/" 这样的子页面上时,他可以手动将 URL 更改为 "test-server/en/" 而无需获取再次重定向。
这是我所知道的:
<rewrite>
<rules>
<rule name="ToGermanPage" enabled="true" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^de" />
<add input="{URL}" pattern=".+test-server" />
</conditions>
<action type="Redirect" url="{R:0}/{HTTP_ACCEPT_LANGUAGE}" appendQueryString="true" />
</rule>
<rule name="ToEnglishPage" enabled="true" stopProcessing="true">
<match url="^test-server" />
<action type="Redirect" url="http://test-server/en" />
<conditions logicalGrouping="MatchAny" trackAllCaptures="false">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^de" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
我的问题是,如果我输入以下内容: 它不会识别 URL,条件中的 {URL} 参数也是如此。
看这条规则...
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^de" />
<add input="{URL}" pattern=".+test-server" />
</conditions>
<action type="Redirect" url="{R:0}/{HTTP_ACCEPT_LANGUAGE}" appendQueryString="true" />
match url
是.*
,会匹配所有资源。如果您只希望重定向适用于 http(s)://test-server/
,您应该指定一个空白资源 (url="^$"
)。
您可以使用 {HTTP_HOST}
而不是 {URL}
来匹配您的主机名(无需担心 http/https
)。
此外,您的重定向 URL 使用 {R:0}
,即 match/resource URL。对于 http://test-server
,match URL 为空,因为未指定资源路径。不过,您应该能够从重定向 URL 中完全删除 {R:0}
,因为您只需要重定向到 de
或 en
。所以,尝试这样的事情:
<match url="^$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^test-server$" />
</conditions>
<action type="Redirect" url="{HTTP_ACCEPT_LANGUAGE}" appendQueryString="true" />
应该匹配 http(s)://test-server
并重定向到:
http(s)://test-server/en
或
http(s)://test-server/de
取决于 {HTTP_ACCEPT_LANGUAGE}
的值。