URL的PHP​​和哈希/片段部分

Posted

技术标签:

【中文标题】URL的PHP​​和哈希/片段部分【英文标题】:PHP & Hash / Fragment Portion of URL 【发布时间】:2010-11-12 19:37:29 【问题描述】:

我正在尝试找到一种方法来保存 url 的哈希部分并作为 php 变量。这个想法有点古怪,但请耐心等待......

我想从以下 URL 中提取“位置”片段并将其保存为 PHP 变量。

http://www.example.com/#location

但是,link 的讨论表明 URL 的片段只能通过 javascript 访问。

但是是否可以创建一个链接,其中片段在 URL 中重复,由 PHP 解析,然后由 mod rewrite 删除?所以....

原网址:

http://www.example.com/location/#location

由于 URL 中简单的“位置”,PHP 获得了位置变量

Apache 然后将链接重写为:

http://www.example.com/#location

我很想知道是否有一种优雅的方法可以解决这个问题。

【问题讨论】:

您可以将片段更改为 $_GET 值吗? 不,你不能。查看我的答案 这是一个使用 javascript 和隐藏输入字段的解决方案 ***.com/questions/940905/… 【参考方案1】:

您需要使用 Javascript 来阅读此内容。有几个不同的选项 - 在页面加载时,您可以使用 XmlHTTPRequest(AJAX 请求)告诉服务器附加的 URL 参数是什么。 Alternatley 您可以检查是否有其他参数(也可以通过 Javascript),如果找到,请发回将这些参数编码到 URL 本身中的其他 URL。

【讨论】:

【参考方案2】:

根据 Mod_Rewrite 论坛上的 thread,片段永远不会发送到服务器。因此,除非您事后使用 AJAX 更改页面,否则这可能是不可能的。

另一个想法是让 Javascript 将哈希转换为 $_GET 参数,然后刷新页面。

【讨论】:

感谢您的回复!我知道片段永远不会发送到服务器。我提出的是“伪片段”或“双片段”,如example.com/fragment/#fragment 第一个片段将由 PHP 解释,然后由 mod_rewrite 删除,将 URL 呈现为example.com/#fragment 也许这种方法没有意义;我不确定它是否确实如此,因此我的问题...... 如果您想将该人发送回 example.com/#fragment,您可以将他们发送到 example.com/fragement,然后 PHP 可以将他们转发到 example.com/#fragement。跨度> 将用户从“example.com/fragment”转发到“example.com/#fragment”的好主意。我将使用 cookie 来保存片段,然后将页面转发给它自己。这样的事情可能会起作用:示例:链接:example.com/test.php?fragment=turkey $fragment = $_GET['fragment']; if (isset($fragment)) setcookie("TestCookie", "TestCookie", time()+3600); header("Location: example.com/test.php/#$fragment"); // 根据 cookie 做一些额外的事情 你最终会在历史堆栈中得到 2 个条目:(更糟糕的是,第一个总是指第二个,所以你的后退按钮导航会很麻烦。【参考方案3】:

您可以通过 AJAX 将哈希片段发送到 PHP 脚本并立即刷新(重新加载页面)

【讨论】:

【参考方案4】:

一旦您通过 AJAX 将值发送到服务器。您可以在 SESSION 中设置片段值。刷新页面时,可以得到在session中设置的fragment并处理,然后显示相应的内容。因为我们无法通过 PHP_SELF / QUERY_STRING 等获取片段值。我们需要这个来提高我们网页的速度,比如 Gmail。

【讨论】:

【参考方案5】:

它包含在从PHP's parse_url function 返回的“片段”值中。

来自 PHP 手册:

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);
?>

将返回:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path

【讨论】:

如果fragment是手动提供给这个函数的情况下是这样,但是与原始问题有关的问题是fragment部分没有发送到服务器。

以上是关于URL的PHP​​和哈希/片段部分的主要内容,如果未能解决你的问题,请参考以下文章

从 URL 获取片段(哈希“#”后的值)[关闭]

如何从 URL 获取片段标识符(哈希 # 后的值)?

Symfony2 将哈希片段参数附加到分页 URL

URL 片段中的多个参数

如何在Angular2 rc3路由中处理来自oauth重定向url的哈希片段

一致性哈希算法PHP测试片段