Ruby on rails 有没有办法知道页面请求是否来自同一个应用程序?
在Rails3中,是否有方法检查我现在呈现的页面是否来自同一应用程序,而不使用硬编码域名 我目前有:Ruby on rails 有没有办法知道页面请求是否来自同一个应用程序?,ruby-on-rails,ruby-on-rails-3,request,referrer,Ruby On Rails,Ruby On Rails 3,Request,Referrer,在Rails3中,是否有方法检查我现在呈现的页面是否来自同一应用程序,而不使用硬编码域名 我目前有: def back_link(car_id = '') # Check if search exists uri_obj = URI.parse(controller.request.env["HTTP_REFERER"]) if controller.request.env["HTTP_REFERER"].present? if uri_obj.present? &&
def back_link(car_id = '')
# Check if search exists
uri_obj = URI.parse(controller.request.env["HTTP_REFERER"]) if controller.request.env["HTTP_REFERER"].present?
if uri_obj.present? && ["my_domain.com", "localhost"].include?(uri_obj.host) && uri_obj.query.present? && uri_obj.query.include?('search')
link_to '◀ '.html_safe + t('back_to_search'), url_for(:back) + (car_id.present? ? '#' + car_id.to_s : ''), :class => 'button grey back'
end
end
但这并没有检查域名前面的“www”和所有其他可能的情况
如果我能找到上一页(推荐人)中使用的特定控制器和操作,那也太好了。我想你看得不对 如果你环顾网页,找到一个具有搜索功能的网站,然后点击链接,你会看到一个显示搜索内容的参数 这是一个很好的方法 通过HTTP\u REFERER执行此操作似乎有点脆弱,例如,从书签或已发布的链接执行此操作是行不通的 例如 然后您只需查找
参数[:from_search]
如果你真的需要通过HTTP\u REFERER
来实现,那么你可能不必担心子域。公正的
def http_referer_uri
request.env["HTTP_REFERER"] && URI.parse(request.env["HTTP_REFERER"])
end
def refered_from_our_site?
if uri = http_referer_uri
uri.host == request.host
end
end
def refered_from_a_search?
if refered_from_our_site?
http_referer_uri.try(:query)['search']
end
end
试着这样做:
ref = URI.parse(controller.request.env["HTTP_REFERER"])
if ref.host == ENV["HOSTNAME"]
# do something
要尝试从引用页面获取控制器/操作,请执行以下操作:
ActionController::Routing::Routes.recognize_path(url.path)
#=> {:controller => "foo", :action => "bar"}
使用request.referer
创建内部请求?
方法。
将请求的主机
和端口
与应用程序的主机
和端口
进行比较
require 'uri' # Might be necesseary.
def internal_request?
return false if request.referrer.blank?
referrer = URI.parse( request.referrer )
application_host = Rails.application.config.action_mailer.default_url_options[ :host ]
application_port = Rails.application.config.action_mailer.default_url_options[ :port ]
return true if referrer.host == application_host && referrer.port == application_port
false
end
然后像这样在需要的地方调用它,很可能在应用程序\u controller.rb
中:
if internal_request?
do_something
end
一些警告:
- 如果您正在使用子域,则可能需要对其进行修改。不过很简单
- 这将要求您在配置中为ActionMailer设置主机和端口,这是常见的
- 您可能希望将其设置为相反的设置,如
外部请求?
,因为您可能以独特的方式处理这些情况。这将允许您执行以下操作:
do_something_unique if external_request?
注意,所有浏览器都不发送推荐信息。有没有特定的浏览器不发送推荐信息?谢谢!那里的代码非常干净!尤其像&&用法(但不知道它返回什么,如果不满足第一个条件,则返回nil或false?)。使用params更可靠,所以我想我会这样做。重点是,我不希望它从书签或发布的链接工作,因为它的目的是制作一个按钮返回搜索(如果以前进行过搜索)。如果没有,那么就不要显示按钮。@Cristian为什么不让用户点击他们的后退按钮呢?你想设计一些你不需要的东西吗?我有一个特殊的情况:搜索列表不是普通的,它允许每个项目扩展而不需要另一个页面,所以这个方法允许我指定一个ID作为锚,这将使项目打开并在返回搜索时滚动页面。从用户体验的角度来看,它可能有它的缺点和优点,但我认为它可能是有益的,至少对一些用户来说是如此。
do_something_unique if external_request?