我有一个包含多个子域的网站,我希望已命名的子域robots.txt与www。不同。
我尝试使用.htaccess,但FastCGI没有查看它。
所以,我试图设置路由,但似乎你不能直接重写,因为每条路由都需要一个控制器:
map.connect '/robots.txt', :controller => ?, :path => '/robots.www.txt', :conditions => { :subdomain => 'www' }
map.connect '/robots.txt', :controller => ?, :path => '/robots.club.txt'
解决此问题的最佳方法是什么?
(我正在使用子域的request_routing插件)
答案 0 :(得分:17)
实际上,您可能希望在mime_types.rb
中设置mime类型并在respond_to
块中执行,因此它不会将其作为'text/html'
返回:
Mime::Type.register "text/plain", :txt
然后,您的路线将如下所示:
map.robots '/robots.txt', :controller => 'robots', :action => 'robots'
对于rails3:
match '/robots.txt' => 'robots#robots'
和控制器之类的东西(把文件放在你喜欢的地方):
class RobotsController < ApplicationController
def robots
subdomain = # get subdomain, escape
robots = File.read(RAILS_ROOT + "/config/robots.#{subdomain}.txt")
respond_to do |format|
format.txt { render :text => robots, :layout => false }
end
end
end
冒着过度工程的风险,我甚至可能会想要缓存文件读取操作......
哦,是的,你几乎肯定要删除/移动现有的'public/robots.txt'
文件。
精明的读者会注意到,您可以轻松地将RAILS_ENV
替换为subdomain
...
答案 1 :(得分:10)
为什么不使用视图中内置的rails?
在您的控制器中添加此方法:
class StaticPagesController < ApplicationController
def robots
render :layout => false, :content_type => "text/plain", :formats => :txt
end
end
在视图中创建一个文件:app/views/static_pages/robots.txt.erb
,其中包含robots.txt内容
在routes.rb
地方:
get '/robots.txt' => 'static_pages#robots'
删除文件/public/robots.txt
您可以根据需要添加特定的业务逻辑,但这样我们就不会读取任何自定义文件。
答案 2 :(得分:1)
对于Rails 3:
创建一个控制器RobotsController:
class RobotsController < ApplicationController
#This controller will render the correct 'robots' view depending on your subdomain.
def robots
subdomain = request.subdomain # you should also check for emptyness
render "robots.#{request.subdomain}"
end
end
创建机器人视图(每个子域1个):
在config / routes.rb中添加新路由:(注意:txt格式选项)
match '/robots.txt' => 'robots#robots', :format => :txt
当然,你应该在config / initializers / Mime_types.rb中声明:txt格式:
Mime::Type.register "text/plain", :txt
希望它有所帮助。
答案 3 :(得分:0)
如果在将请求发送到rails之前无法配置您的http服务器,我只需设置一个“机器人”控制器来呈现如下模板:
def show_robot
subdomain = # get subdomain, escape
render :text => open('robots.#{subdomain}.txt').read, :layout => false
end
根据您要完成的任务,您还可以使用单个模板而不是一堆不同的文件。
答案 4 :(得分:0)
我喜欢TA Tyree的解决方案,但它非常以Rails 2.x为中心,所以这就是我为Rail 3.1.x提出的建议
mime_types.rb
Mime::Type.register "text/plain", :txt
通过在路由中添加格式,您不必担心在控制器中使用respond_to块。 的routes.rb
match '/robots.txt' => 'robots#robots', :format => "text"
我在这个上添加了一些额外的东西。搜索引擎优化人员抱怨子域名和SSL页面中的重复内容,因此我创建了两个用于生产的机器人文件和一个用于生产的机器人文件,这些文件也将用于生产中的任何SSL / HTTPS请求。
robots_controller.rb
class RobotsController < ApplicationController
def robots
site = request.host
protocol = request.protocol
(site.eql?("mysite.com") || site.eql?("www.mysite.com")) && protocol.eql?("http://") ? domain = "production" : domain = "nonproduction"
robots = File.read( "#{Rails.root}/config/robots-#{domain}.txt")
render :text => robots, :layout => false
end
end
答案 5 :(得分:0)
自 Rails 6.0 起,此功能已大大简化。
默认情况下,如果使用:plain选项,则文本将不显示 使用当前布局。如果您想让Rails将文字放入 当前布局,您需要添加layout:true选项并使用 布局文件的.text.erb扩展名。 Source
class RobotsController < ApplicationController
def robots
subdomain = request.subdomain # Whatever logic you need
robots = File.read( "#{Rails.root}/config/robots.#{subdomain}.txt")
render plain: robots
end
end
在routes.rb
get '/robots.txt', to: 'robots#robots'