iis 在Azure App Service中设置反向代理以将请求从子目录指向子域

slhcrj9b  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(191)

我有一个WordPress网站位于https://blog.example.com和另一个网站托管在Azure应用服务(Windows)在https://www.example.com。Cloudflare位于这两个网站的前面。
我已经设置了一个反向代理,将请求从https://www.example.com/blog指向https://blog.example.com。这似乎主要是工作,因为博客文章出现在预期的URL(即https://www.example.com/blog/a-blog-post)下,但有一些特点让我觉得有些东西设置得不太正确:

  • 当在WordPress管理面板中提交某些表单时(例如常规设置),它会将用户退出会话并重定向到登录页面(URL参数引用blog.example.com
  • 在WordPress管理面板中使用分页重定向到页面,但在https://blog.example.com
  • 在WordPress管理面板中有一些页面出现控制台错误,表明某些coludnot从https://blog.example.com加载
  • 当我从https://blog.example.com-〉https://www.example.com/blog添加一个301重定向时,它进入了一个无限重定向循环。

从我的阅读,我相信所有这些问题都发生了,因为当请求被托管WordPress的服务器处理时,Host头是https://blog.example.com而不是https://www.example.com。(例如here),其中WordPress使用主机头来构建某些URL,而不是WordPress网站URL或主页URL(都设置为https://www.example.com/blog)。Microsoft recommends保留原始主机头来解决这些问题。
IIS上的应用程序请求路由(ARR)有一个preserveHostHeader选项,大概是用来保留原始主机头的。我已经尝试启用此选项,但代理完全停止工作:

  • 访问https://www.example.com/blog(博客的根目录)可以看到https://www.example.com主页
  • 访问https://www.example.com/blog/a-blog-post显示404(由https://www.example.com站点生成)

以下是我现有的设置:

applicationHost.xdt*(在Azure应用服务上启用ARR,因为默认情况下已禁用)*

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <system.webServer>
        <proxy xdt:Transform="InsertIfMissing" enabled="true" preserveHostHeader="false" reverseRewriteHostInResponseHeaders="false"/>
        <rewrite xdt:Transform="InsertIfMissing">
            <allowedServerVariables xdt:Transform="InsertIfMissing">
                <add name="HTTP_X_ORIGINAL_HOST" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
                <add name="HTTP_X_UNPROXIED_URL" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
                <add name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
                <add name="HTTP_ACCEPT_ENCODING" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
            </allowedServerVariables>
        </rewrite>
    </system.webServer>
</configuration>

web.config*(重写子目录-〉子域的请求)*

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\Example.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />

      <rewrite>
        <rules>
          <clear />
          <rule name="Blog Proxy" stopProcessing="false">
            <match url="^blog(?:$|/)(.*)" />
            <action type="Rewrite" url="https://blog.example.com/{R:1}" appendQueryString="true" logRewrittenUrl="false" />
            <serverVariables>
              <set name="HTTP_X_UNPROXIED_URL" value="https://blog.example.com/{R:1}" />
              <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
              <set name="HTTP_X_ORIGINAL_HOST" value="{HTTP_HOST}" />
              <set name="HTTP_ACCEPT_ENCODING" value="" />
            </serverVariables>
          </rule>
        </rules>
      </rewrite>
    </system.webServer>
  </location>
</configuration>

这似乎是反向代理的标准设置,但是唉。这是因为我在Cloudflare后面运行吗?preserveHostHeader不适用于Azure应用服务吗?我如何设置此反向代理以便它处理我的用例?

pftdvrlh

pftdvrlh1#

问题原来是网络主机如何设置他们的环境。
配置服务器的方式是,当请求特定的主机名时,检查vhost文件中是否有该主机名。当找到匹配的主机名时,从vhost文件中设置的DocRoot加载内容。
在我的情况下,没有配置vhost文件来处理www.example.com的请求。在这种情况下,默认的 catchall vhost文件会将此请求转发到服务器上的catchall DocRoot,因此当我们在末尾添加/blog时,该路径不存在的catchall DocRoot所以它的返回一个404.在帐户上添加www.example.com作为指针域,告诉服务器哪个DocRoot为该主机名的请求提供服务,这似乎解决了我正在处理的关于404响应的问题。
我想也许“指针域”的概念是这个特定的网络主机所独有的,这个问题或答案可能不适用于一般情况。希望它能给你一个地方看看,如果你正在经历同样的事情。

相关问题