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

时间:2017-02-03 12:40:14

标签: ruby-on-rails ruby heroku amazon-s3 reverse-proxy

由于业务需求,每次在管理面板中添加新页面时,我都需要创建新的站点地图。我们正在使用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

但是当我们使用Google网站管理员工具提交时,我收到错误,说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正确显示。

有什么想法吗?我们甚至试图做什么?

2 个答案:

答案 0 :(得分:1)

遇到同样的问题,因为我所使用的系统位于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

这个问题很旧,但希望对以后的人有所帮助。

答案 1 :(得分:0)

你可以创建一个像xml一样响应的动作app/controllers/sitemap_controller.rb

  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搜索引擎,你就可以了。 快乐的编码!