【问题标题】:Url being trimmed if # is present如果存在 #,则 URL 将被修剪
【发布时间】:2015-01-27 21:56:16
【问题描述】:

我已阅读此内容:What does /#!/ mean in URL?,因此我知道 # 是一个片段分隔符,但我在使用 $_GET 将 URL 显示在包含 # 的后续页面上时遇到了困难。

我有一个 php 页面,它将用户输入(一个 URL)发送到显示它的另一个页面。

<?php echo $_GET["url"]; ?>

包含变量的 url 看起来像这样......

http://website.com/qr/index.php?url=http://www.example.com&many=false&set=false

http://www.example.com 显示出来。

而 url 包含这样的片段...

http://website.com/qr/index.php?url=http://www.example.com/#fragment&many=false&set=false

什么都不显示。

我无法使用 $_POST。

感谢您的帮助。

【问题讨论】:

  • 其实$_GET['url']这两种情况都应该填写,因为#在url参数后面。在第二种情况下,您将无法阅读 $_GET['many'] 和 $_GET['set'],因为它是片段的一部分(未发送到服务器 afaik),但 $_GET['url'] 应该没问题。所以我认为错误应该在其他地方。
  • 如果您将 # 作为参数值的一部分传递,您必须先对其进行 URLEncode。不能将其保留为 #,因为这样会将其视为此 url 的一部分,而不是参数值的一部分。
  • 非编码 # 后面的所有内容都不会发送到服务器

标签: php


【解决方案1】:

您可能应该 URL encode 您在 URL 中放置的参数,特别是因为它也是一个 URL(这意味着它很有可能包含在 URL 上下文中具有特殊含义的字符,例如# 和 /)。如果您使用 Javascript 将 URL 参数放入,您可以使用 encodeURIComponent 执行此操作。如果您使用 PHP 添加该 URL 参数,则为 urlencode

从第一个链接开始,井号属于“不安全字符”类别,作者为此提供了进一步的建议(强调我的):

由于各种原因,某些字符可能会在 URL 中被误解。 这些字符也应该总是被编码。

“不安全”的名称来自RFC 1738,它专门针对磅字符(再次强调我的):

所有不安全的字符必须始终在 URL 中进行编码。为了 例如,字符“#”必须在 URL 中进行编码即使在 通常不处理片段或锚点的系统 标识符,这样如果 URL 被复制到另一个系统 确实使用它们,则无需更改 URL 编码。

【讨论】:

    【解决方案2】:

    您应该使用urlencode 或rawurlencode。否则,“#”之后的所有内容都是片段的一部分,您可能会遇到一些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2023-03-03
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多