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和哈希/片段部分的主要内容,如果未能解决你的问题,请参考以下文章