由于业务需求,每次在管理面板中添加新页面时,我都需要创建新的站点地图。我们正在使用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正确显示。
有什么想法吗?我们甚至试图做什么?
答案 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搜索引擎,你就可以了。 快乐的编码!