提问人:Aayush Kothari 提问时间:9/15/2023 更新时间:9/25/2023 访问量:96
如何将子域重定向到主域中用作反向代理的子目录?
How do I redirect a subdomain to a subdirectory in primary domain serving as reverse-proxy?
问:
我将首先描述当前的设置,然后描述我想将其更改为什么。
当前设置
- 主域 www.example.com 指向部署在 Heroku 上的 Ruby on Rails 应用。
- Wordpress 博客 blog.example.com 在 Flywheel 上运行。
- RoR 应用程序用作反向代理,用于在 /blog 子目录下加载飞轮内容。例如,www.example.com/blog/page1 从 blog.spacebox.com/page1 加载内容。我们正在使用 https://github.com/waterlink/rack-reverse-proxy 来完成这项工作。
以上所有工作都按预期进行。
我们想要什么
现在,营销团队想要提升 SEO 游戏,希望 blog.example.com/* 重定向到 www.example.com/blog/*
到目前为止我尝试过什么(当然失败了)
- 在飞轮仪表板上设置重定向以 www.example.com/blog/$1(预期会导致无限重定向)。
- 从 DNSSimple 中删除了 blog.example.com 的 A 记录(指向飞轮 IP 地址),并替换为指向 www.example.com 的 CNAME(不起作用)。
有了上面给出的堆栈,如何才能达到预期的结果?您建议如何更改堆栈以实现结果?
提前非常感谢,因为我花了好几天时间试图完成这项工作。
答:
若要将子域重定向到用作反向代理的主域中的子目录,可以使用以下步骤:
1.配置您的 DNS 记录。您需要为子域创建指向主域 IP 地址的 CNAME 记录。配置反向代理。您需要配置反向代理,以将对子域的请求转发到主域中的子目录。例如,如果您的子域已 blog.example.com,并且您希望将其重定向到主域的 /blog 子目录,则可以将反向代理配置为将请求转发给 blog.example.com example.com/blog。
2.在主域名中配置重定向。您需要在主域中配置重定向,以将所有对子域的请求重定向到子目录。例如,如果您的主域是 example.com,并且您希望将所有对 blog.example.com 的请求重定向到 /blog 子目录,则可以在 example.com 中配置重定向以将所有请求重定向到 /blog。
配置 DNS 记录、反向代理和重定向后,对子域的所有请求都将重定向到主域中的子目录。
评论
假设你真的想要重定向,这实际上非常简单,可以在 Rails 路由中处理。
get '/:blog_page', to: redirect('/blog/%{blog_page}'), constraints: { subdomain: 'blog' }
进入博客子域的每个 get 请求都与此路由匹配,并将被重定向到相应的路径。/blog
查看 Rails 路由文档了解更多详情。
评论
由于它更多地来自 SEO POV,而不是来自 Rails 实现 POV,因此您可以尝试的选项很少 -
- 由于博客应用程序托管在其他服务器上,您唯一能做的就是使用指向该外部页面的 SEO 友好链接进行重定向。看看这里,了解使锚标签SEO友好的最佳方法。
- 反向链接 - 如果你想要更多的控制权,我宁愿建议你使你的页面对 Rails(谁有链接到你的博客页面)和反向链接(从你的博客指向 rails 应用程序)都更加 SEO 友好。你可以在这里阅读更多关于反向链接的信息。
希望它有所帮助。
这些是我必须完成的步骤,以实现类似的场景。也许其中一些会有所帮助。
我不确定重定向步骤,因此我只会提供一个幼稚的场景,可以通过两种方式完成:
- 在 DNS 区域中创建从 to 或
blog.example.com
example.com/blog
- 像这样使用重定向元标记在目录中创建简单文件
index.html
blog.exmaple.com
...
<meta http-equiv="refresh" content="0; url=https://www.example.com/blog">
...
为了我的需要,我还有一个反向代理,但它是在nginx Web服务器下配置的,如下所示:
server {
listen 443
location /blog {
root /blog/public;
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_redirect off;
}
}
Rails 应用程序由端口 8080 上的独立 Passenger 应用服务器提供服务。
接下来,重新配置 Rails 应用程序(在 6.1 版本下测试)以从子目录提供:
- 创建环境变量
RAILS_RELATIVE_URL_ROOT=/blog
- 更新文件,可以使用以前设置的变量或只是硬编码它
config.ru
require_relative "config/environment"
map ENV["RAILS_RELATIVE_URL_ROOT"] || "/" do
run Rails.application
Rails.application.load_server
end
- 通过添加以下条目来更新文件
config/application.rb
...
config.relative_url_root = ENV["RAILS_RELATIVE_URL_ROOT"] if ENV["RAILS_RELATIVE_URL_ROOT"]
...
注意:对于上述方法,请确保从 Rails 控制台的角度看到变量。ENV["RAILS_RELATIVE_URL_ROOT"]
正如我所说,这不是一个具有明显答案的 1 对 1 情况,但它有一些相似之处(从子目录提供 Rails 应用程序),所以我认为它可能被证明是有用的。
评论