【问题标题】:Modifying query url/path without redirect在不重定向的情况下修改查询 url/路径
【发布时间】:2023-03-30 10:58:01
【问题描述】:

我正在想办法在 Puma 收到我的请求 URL 之前修改它。

示例:

用户使用 /locale/resource/:id 之类的网址访问网站。 但我希望他重定向/locale/'resource/resource-slug,因为它更漂亮。

我已经做了第一个版本。

before_action :redirect_with_pretty_challenge_url, only: %w(index show new edit)

private

def redirect_with_pretty_challenge_url
  param_kind = challenge_show_or_admin_challenges? ? :id : :challenge_id
  return unless params_is_id?(param_kind)

  redirect_to stubbed_request_path_parameters(param_kind)
end

def params_is_id?(param_kind)
  return true if params[param_kind].is_a?(Integer)

  params[param_kind].to_i.to_s == params[param_kind]
end

def stubbed_request_path_parameters(param_kind)
  request.path_parameters[param_kind] = Challenge.find_by_params(params[param_kind])&.slug
  request.path_parameters
end

因此,用户会被重定向到“正确”的 url,但需要重定向...

我想知道是否有一种方法可以直接在请求中修改 url,这样我就不必重定向到用户,它会使这种操作方式更加“透明”。

有可能吗?还是由于 HTTP 协议而完全不可能?

【问题讨论】:

  • 您可以更改 request URI in nginx 或 apache,但它不会更新浏览器地址栏 - 正是 Rack/Rails 将其视为请求 uri。恕我直言,只要学会接受它,您的用户很可能永远不会关心 URL。
  • 也许用户不在乎。但是我愿意。我想控制显示的内容。甚至是网址。我想我会坚持使用旧的重定向。

标签: ruby-on-rails ruby-on-rails-4 httprequest puma


【解决方案1】:

slugUrl 传递给javascript 并使用history.replaceState()

stateObj = history.state     # in the case somebody already uses it
stateObj.url = slugUrl       # will help with turbolinks and like
history.replaceState stateObj, "", url

例如,您可以将 slugUrl 甚至放在模板中,并将 slug 构建登录放在 ApplicationController 辅助方法中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2013-08-11
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多