使用 url 重写将子域从一个域重定向到 iis 中另一个域的子域

Hus*_*hsh 3 iis url-rewriting .net-core

我想将 iis 的子域重定向到 localhost:port 中的子域,我的 dotnet 核心应用程序正在运行。


只是我想像这样重定向:

xyz.example.com => xyz.localhost:4000

john.example.com => john.localhost:4000

test.example.com => test.localhost:4000

example.com => localhost:4000(没有子域地址重定向到 localhost:4000)


我如何使用 url 重写规则来做到这一点是 iis?


编辑:

有一些针对一个子域的解决方案(如这个问题),但我的问题更笼统,将所有子域从一个域重定向到另一个域中的相应子域。

Cod*_*ler 5

这是执行您要求的重定向的规则:

<rewrite>
    <rules>
        <rule name="Test Rule" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{HTTP_HOST}" pattern="^((.+.)?)example.com" />
            </conditions>
            <action type="Redirect" url="http://{C:1}localhost:4000{REQUEST_URI}" appendQueryString="false" />
        </rule>
    </rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

这很简单:

  1. <match url=".*" />匹配任何 URL。example.com在后面的条件中检查请求的 URL 是否在域中。match部分对我们的情况没有用,因为它使用没有主机名的 URL 部分(在第一个“/”之后)。

  2. 条件<add input="{HTTP_HOST}" pattern="^((.+.)?)example.com" />匹配域,如xyz.example.comexample.com。如果条件匹配,捕获组{C:1}将包含xyz.forxyz.example.com和空字符串 for example.com,将进一步使用。

  3. <action type="Redirect" url="http://{C:1}localhost:4000{REQUEST_URI}" appendQueryString="false" />

    结果 URL 构建为http://{C:1}localhost:4000{REQUEST_URI}. {C:1}将持有如上所述的子域名,并{REQUEST_URI}在主机名之后包含 URL 部分。我们也设置appendQueryString为,false因为查询是{REQUEST_URI}.

您应该添加这<rewrite>部分网站web.config<system.webServer>。您也可以从 IIS 配置管理器手动配置它。这是此类配置的屏幕截图:

在此处输入图片说明

最后,这是一组演示如何更改 url 的测试:

[TestCase("http://xyz.example.com", "http://xyz.localhost:4000/")]
[TestCase("http://xyz.example.com/some/inner/path", "http://xyz.localhost:4000/some/inner/path")]
[TestCase("http://xyz.example.com/some/inner/path?param1=value1&param2=value2", "http://xyz.localhost:4000/some/inner/path?param1=value1&param2=value2")]
[TestCase("http://example.com", "http://localhost:4000/")]
[TestCase("http://example.com/some/inner/path", "http://localhost:4000/some/inner/path")]
[TestCase("http://example.com/some/inner/path?param1=value1&param2=value2", "http://localhost:4000/some/inner/path?param1=value1&param2=value2")]
public void CheckUrlRedirect(string originalUrl, string expectedRedirectUrl)
{
    using (var httpClient = new HttpClient(new HttpClientHandler {AllowAutoRedirect = false}))
    {
        var response = httpClient.GetAsync(originalUrl).Result;

        Assert.AreEqual(HttpStatusCode.MovedPermanently, response.StatusCode);
        var redirectUrl = response.Headers.Location.ToString();
        Assert.AreEqual(expectedRedirectUrl, redirectUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)