Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有没有办法知道页面请求是否来自同一个应用程序?_Ruby On Rails_Ruby On Rails 3_Request_Referrer - Fatal编程技术网

Ruby on rails 有没有办法知道页面请求是否来自同一个应用程序?

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? &&

在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? && ["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?