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