获取包括查询字符串在内的完整URL,包括#后面的内容。

4
如何获取包括哈希标记后的字符串参数在内的完整 URL ?我尝试使用echo
$url = $_SERVER['REQUEST_URI'];
echo $url;
< p > # 标签后面的字符串将不会被读取。 < /p >

13
那部分内容永远不会传输到服务器,它只存在于浏览器中。 - Pekka
@Pekka웃 很棒的回答 ;) 。你可以使用js函数并将其传递给其他工作。这里有一个类似于你的问题的问题。 https://dev59.com/LWjWa4cB1Zd3GeqPro_V - babak faghihian
@Pekka웃 所以即使我使用 encodeURIComponent(),浏览器仍然会忽略 %23 之后的所有内容? - lightbringer
3个回答

12
Pekka的评论应该是一个答案。井号后的字符串参数不会发送到服务器,只是为浏览器提供信息。
这意味着服务器端代码(在您的情况下为PHP)没有此信息。客户端代码(浏览器、JavaScript等)有此信息。
理想情况下,
  • 问号后面的部分是服务器需要的信息。把您服务器所需的所有内容放在这里
  • 井号后面的部分是客户端需要的信息。把您客户端需要的所有内容放在这里。它被称为片段标识符(感谢Tim)。
历史上,井号后面的部分通常用于使您的浏览器快速滚动到页面上已定义的锚点。现在,它更经常用于为客户端保留状态信息。
您可以使用JavaScript将此信息发送到服务器,或者根据此信息执行不同的操作。 AJAX是您的朋友。

+1,回答得很好!https://mail.google.com/mail/u/1/#inbox中的#inbox也是片段标识符和客户端的信息吗? - Tim
Tim:不错的发现,我会加上它! - Konerak
“#inbox”在“https://mail.google.com/mail/u/0/#inbox”中是一种无需页面刷新即可从页面导航的方式吗?它是在服务器端还是客户端(Web浏览器)上实现的? - Tim
Tim:你看了自己的链接吗? :) 片段标识符应该仅在客户端使用(尽管脚本可以更改此内容)。早些时候,它经常用于使用锚点在页面内导航。现在,它被重新用于类似的目的,例如动态加载内容的单页网站。 - Konerak

2

哈希值(包含#的字符串)不会被传递到服务器,它仅是浏览器的行为属性。然而$_SERVER['REQUEST_URI']变量将包含剩余部分。

如果你真的需要知道哈希值,你需要使用JavaScriptdocument.location.hash属性,它包含哈希值的内容(然后你可以将其插入表单中或通过ajax请求发送到服务器)。你可以使用一个Javascript onload function将完整的URL(包括#后面的部分)发送到Ajax端点。

你也可以在这里查看获取完整的URL,包括查询字符串和锚点


0

使用urlencode()urldecode()函数。

在这个简短的例子中,我将向您展示如何将哈希值传递到服务器,并使其重定向到哈希值。

首先,在链接按钮中编码哈希值。

<a href="mylink.php?redirect=link1<?= urlencode("#tab5") ?>">redirect to Link1 </a>

现在从服务器重定向到链接 mylink.php

if ($_GET["redirect"] != null )
    {
        header("location: urldecode($_GET["redirect"]);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接