繁体   English   中英

如何在 Rails 中使用反向代理服务 sitemap.xml?

[英]How to serve a sitemap.xml using reverse proxy in rails?

由于业务需要,每次在管理面板中添加新页面时,我都需要创建一个新的站点地图。 我们正在使用 Heroku,所以我们查看了sitemap_generator gem 来执行此操作。 每次调用rake sitemap:refresh时,我们都会上传站点地图。

但是站点地图需要在我们的域内,例如https://example.org/sitemap.xml 所以我们决定使用反向代理(使用rack-reverse-proxy gem)

在我们的 config.ru 中我们有

use Rack::ReverseProxy do
  reverse_proxy '/sitemap.xml', 'http://our-bucket.amazonaws.com/sitemaps/sitemap.xml', :timeout => 15000,   :preserve_host => true
end

我们的 robots.txt 文件是

User-Agent: *
Allow: /
Disallow: /admin

但是当我们在谷歌网站管理员工具中提交时,我得到一个错误,说URL restricted by robots.txt ,当我尝试直接在浏览器中访问https://our_domain.com/sitemap.xml我得到一个

<Error>
  <Code>InvalidArgument</Code>
  <Message>Unsupported Authorization Type</Message>
  <ArgumentName>Authorization</ArgumentName>

但是访问 s3 链接http://our-bucket.s3.amazonaws.com/sitemaps/sitemap.xml我们的 sitemap.xml 显示正确。

有任何想法吗? 我们正在尝试做的事情有可能吗?

遇到同样的问题,因为我在一个支持 Basic Auth 的系统上,所以它传递了 S3 不喜欢的标头。

通过将 reverse_proxy 更新到最新的提交来解决我的问题(出于某种原因,我需要的设置没有进入最新的发布标签):

gem 'rack-reverse-proxy', require: 'rack/reverse_proxy', git: 'https://github.com/waterlink/rack-reverse-proxy.git', ref: 'a4f28a6'

并将以下设置添加到 reverse_proxy:

config.middleware.use Rack::ReverseProxy do
  reverse_proxy_options stripped_headers: ['Authorization']
  ... <rules here>
end

这个问题很老,但希望这对将来的人有所帮助。

您可以创建一个像app/controllers/sitemap_controller.rb这样的 xml 响应的操作:

  layout false
  def index
    @my_pages = Pages.all
    render formats: :xml
  end

和相应的视图文件app/views/sitemap/index.xml.builder

base_url = request.url.chomp('sitemap.xml')

xml.instruct! :xml, version: '1.0', encoding: 'utf-8'

xml.tag! 'urlset',
  'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9',
  'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
  'xsi:schemaLocation' => 'http://www.sitemaps.org/schemas/sitemap/0.9
   http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' do

     @my_pages.each do |page|
       xml.url {
         xml.loc URI.join(base_url, page.url)
       }
     end
  end

不要忘记为它创建一个路由: config/routes.rb

    get '/sitemap.xml', to: 'sitemap#index'

无需反向代理,您还可以创建一个 rake 任务来 ping 搜索引擎,这样就可以了。 编码愉快!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM