在 PHP 重定向期间处理片段标识符

Posted

技术标签:

【中文标题】在 PHP 重定向期间处理片段标识符【英文标题】:Handling fragment identifiers during PHP redirects 【发布时间】:2012-09-21 20:34:27 【问题描述】:

我已经四处搜索(SO 和 Google),但找不到任何关于其他人如何处理这种情况的适当解释。

在我的应用程序中,我使用 php/Apache 作为后端,Ben Alman's jQuery BBQ plugin 用于标签浏览器历史记录。用户登录仅由 PHP 服务器端使用来自登录页面的 POST 处理,并使用服务器端会话维护状态。我遇到的问题是,如果用户访问带有片段(哈希)的 URL 并且他们没有登录,他们将被重定向到 HTTPS 登录页面。除了 URL 包含片段散列之外,这在所有情况下都适用。从服务器端发起的任何重定向都会出现同样的情况。在这种情况下,不能使用 javascript 在重定向之前保留主题标签,因为页面加载在重定向之前永远不会完成。

我意识到片段会在重定向期间丢失(因为它只是客户端)并且服务器端永远不会看到,但是其他人如何处理这种情况并保留最初访问的 URL,以便用户可以结束登录或重定向后在正确的页面上?

任何建议表示赞赏。谢谢。

【问题讨论】:

$_SESSION 和 Ajax 浮现在脑海中? 怎么办?重定向发生在任何 ajax 调用完成之前。 【参考方案1】:

使用 JavaScript 使用片段填充隐藏的输入。

<input type="hidden" name="fragment" id="fragment">
<script>
if(window.location.hash)
    document.getElementById("#fragment").value=window.location.hash;

</script>

然后在后端,你可以这样重定向:

if(isset($_POST['fragment'])) 
    $fragment = '#'.$_POST['fragment'];
 else 
    $fragment = '';

header('Location: http://website/path'.$fragment);
exit;

您应该可能对片段进行urlencode。

【讨论】:

以上是关于在 PHP 重定向期间处理片段标识符的主要内容,如果未能解决你的问题,请参考以下文章

Linux I/O重定向

linux中重定向学习总结

shell编程之重定向

重定向到另一个域然后返回后丢失会话

在重定向期间切换协议

Linux---文件操作