【问题标题】:How can one retain URL fragment after server-side redirection?服务器端重定向后如何保留 URL 片段?
【发布时间】:2021-08-06 04:35:34
【问题描述】:

具体来说,我目前正在开发一个需要这种行为的 Ruby on Rails 应用程序,但在意识到许多关于 SO 的现有问题都涉及特定语言后,我故意以与语言和框架无关的方式来表述我的标​​题或框架。我希望提供一些关于如何在任何语言/框架中解决/实施此问题的一般性建议/指南。

背景:

正在开发的应用是一个带有登录页面的 Ruby on Rails 应用。登录后,某条路线通向一个页面,在该页面底部显示(某种反馈)表单。这个表单部分可以使用 URL 片段来聚焦(我希望有一个锚点)。

如果用户已经登录,则跟随带有已附加片段的路由的 URL 会导致以表单部分为焦点的页面。

但是,我需要一个解决方案,其中单个精心制作的 URL 会导致该部分,而不管用户最初是否登录。如果用户尚未登录,则应显示登录页面,成功登录后,应关注表单部分。

除此之外,该 URL 将包含在电子邮件中。

但是,片段在重定向时会丢失,因为它似乎不是由浏览器发送到服务器的,并且重定向是在服务器端使用:

def after_sign_in_path_for(resource)
  params[:redirect_path].presence || stored_location_for(resource)
end

对于这种可以用任何语言或框架实现的场景,是否有一个好的、简单、干净的解决方案?

虽然我目前确实有一种解决方案,但我对它并不完全满意,因为它看起来有点像 hack。我将在下面将其作为答案发布,希望其他人能提出更好的解决方案。

【问题讨论】:

    标签: url redirect url-fragment


    【解决方案1】:

    请注意:这有点小题大做,我不太喜欢。

    基本上我所做的是将片段两次附加到 URL,一次使用 # urlencoded 并作为查询字符串的一部分,一次未编码。这是为了支持用户尚未登录和已登录的两种情况。

    在服务器端,在重定向到登录页面之前,我们会捕获当前 URL,然后使用它来重定向回来。但是,自然地,捕获的 URL 不包含未编码的片段,这将被浏览器隐藏,但是,将存在 urlencoded 片段。这可以在保存之前(立即捕获)或在稍后使用之前,在重定向之前解码。本质上,您需要做的是用未编码的# 替换最后一次出现的%23 编码的#,然后将其用于重定向目的。您可以使用正则表达式替换来执行此操作。例如,我在 Ruby 中将 /.*\K%23/ 替换为 '#'(见下文)。

    示例:

    https://example.com/resource/00000000-0000-0000-0000-000000000000?%23feedback-form#feedback-form
    

    Ruby on Rails:

    def after_sign_in_path_for(resource)
      (params[:redirect_path].presence || stored_location_for(resource))&.sub(/.*\K%23/, '#')
    end
    

    希望这对某人有所帮助,但我仍然希望有更好的方法来做到这一点。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2018-06-20
      • 2018-12-30
      • 2013-08-01
      • 2011-10-07
      • 2011-08-18
      • 2018-11-18
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多