【问题标题】:Accessing # character in URL through $_GET通过 $_GET 访问 URL 中的 # 字符
【发布时间】:2011-08-06 01:28:27
【问题描述】:

我通过 URL 传递数据,然后使用 PHP 的 $_GET[] 函数访问它。如果 URL 中某处有“#”,则 GET 请求似乎会截断字符串。例如,

http://example.com/yyy.php?version=0.88&value=ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D、F#、Java 5、Nemerle、Vala 平台 通用语言基础设施许可证 CLR 专有的常用文件扩展名 .cs 网站 C Sharp Programming at 维基教科书 C#(读作 /ˈsiː ˈʃɑrp/ 见尖锐)是一个多范式 编程语言包括 命令式,声明式,函数式, 通用的,面向对象的 (基于类)和面向组件 编程学科。@10902

$_GET['value'] 返回:

ART:C_Sharp_(programming_language)@Multi-paradigm_programming_language@Influenced D, F

有没有办法避免这种情况?我应该从发布到 URL 的值中去掉所有 # 吗?

使用 XMLHttpRequest() 从客户端 JavaScript 代码访问 URL 位置。来自 javascript 功能 encodeURIComponent() 的编码字符串是,

ART%3AC_Sharp_%2528programming_language%2529%40Multi-paradigm_programming_language%40Influenced%20D%2C%20F%23%2C%20Java%205%2C%20Nemerle%2C%20Vala%20Platform%20Common%20Language%20Infrastructure%20License%20CLR %20Proprietary%20Usual%20file%20extensions%20.cs%20Website%20C%20Sharp%20Programming%20at%20Wikibooks%20C%23%20(发音%20%2F%CB%88si%CB%90%20%CB%88 %CA%83%C9%91rp%2F%20see%20sharp)%20is%20a%20multi-paradigm%20programming%20language%20encompassing%20imperative%2C%20declarative%2C%20functional%2C%20generic%2C%20object-oriented% 20(基于类)%2C%20and%20面向组件%20编程%20学科。%8681

'yyy.php'记录的解码输出:

ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D、F#、Java 5、Nemerle、Vala 平台 通用语言基础设施许可证 CLR 专有的常用文件扩展名 .cs 网站 C Sharp Programming at Wikibooks C#(读作 /ˈsiË ËˆÊƒÉ‘rp/see sharp) 是一个 多范式编程语言 包括命令式、声明式、 函数式的、通用的、面向对象的 (基于类)和面向组件 编程学科。@8681

不使用 encodeURIComponent() 的记录输出以及预期的结果:

ART:C_Sharp_(programming_language)@Multi-paradigm_programming_language@Influenced D、F#、Java 5、Nemerle、Vala 平台 通用语言基础设施许可证 CLR 专有的常用文件扩展名 .cs 网站 C Sharp Programming at 维基教科书 C#(读作 /ˈsiː ˈʃɑrp/ 见尖锐)是一个多范式 编程语言包括 命令式,声明式,函数式, 通用的,面向对象的 (基于类)和面向组件 编程学科。@8681

【问题讨论】:

  • 你能把网址放在那里吗,你的网址里有_%??
  • @experimentX:好的,我编辑了.....现在如何完全恢复编码/变形的字符?
  • 好吧,我认为最好的方法似乎是将# 替换为%23。我不知道像# 这样的其他字符可能会造成麻烦。有什么想法吗?

标签: javascript php url


【解决方案1】:

你试过 parse_urlPHP_URL_FRAGMENT 吗?

echo parse_url($url, PHP_URL_FRAGMENT);

【讨论】:

    【解决方案2】:

    尝试传递编码urlencode()的参数。

    header('Location: http://your_url?version=0.88&value='.urlencode('ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D, F#, Java 5, Nemerle, Vala Platform Common Language Infrastructure License CLR Proprietary Usual file extensions .cs Website C Sharp Programming at Wikibooks C# (pronounced /ˈsiː ˈʃɑrp/ see sharp) is a multi-paradigm programming language encompassing imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.@10902'));
    

    在 js 上你有

    window.location = 'index.php?value='+encodeURIComponent('ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D, F#, Java 5, Nemerle, Vala Platform Common Language Infrastructure License CLR Proprietary Usual file extensions .cs Website C Sharp Programming at Wikibooks C# (pronounced /ˈsiː ˈʃɑrp/ see sharp) is a multi-paradigm programming language encompassing imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.@10902');
    

    更新

    window.location = 'index.php?version=0.88&value='+encodeURIComponent('ART:C_Sharp_(programming_language)@Multi-paradigm_programming_language@Influenced D, F#, Java 5, Nemerle, Vala Platform Common Language Infrastructure License CLR Proprietary Usual file extensions .cs Website C Sharp Programming at Wikibooks C# (pronounced /ˈsiː ˈʃɑrp/ see sharp) is a multi-paradigm programming language encompassing imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.@8681');
    

    【讨论】:

    • 这里只是挑剔,但位置标头值应该是完整的URI,包括方案(http,https等),主机和路径
    • 对不起,我忘了提.....这些值是使用 XMLHttpRequest() 从客户端 javascript 发送的。 javascript中是否有类似的函数来处理这个问题?
    • @experimentX:网站w3schools.com/jsref/jsref_encodeURI.asp 说“这个函数对特殊字符进行编码,除了:, / ? : @ & = + $ #”。我错过了什么吗?
    • @user548245 使用 encodeURIComponent 并请一些显示名称。
    • @experimentX:谢谢。对于解码然后在'yyy.php'上我应该使用'urldecode()'并且它可以在javascript编码的字符串上正常工作吗?对不起,我是新手。非常感谢您的回复。
    【解决方案3】:

    URL 字符串中的# 是片段标识符。在将字符串添加到 URL 之前,您需要 urlencode()

    你不能在你的 yyy.php 脚本中做任何事情,因为 PHP 没有访问 URL 片段的权限。

    参考:http://en.wikipedia.org/wiki/Fragment_identifier

    【讨论】:

    • 啊抱歉我忘了提.....这些值是使用 XMLHttpRequest() 从客户端 javascript 发送的。 javascript中是否有类似的函数来处理这个问题?
    【解决方案4】:

    # 之后的 URL 部分是片段,永远不会发送到服务器。它仅由用户代理处理。您需要使用 JavaScript 与之交互。

    但是,在您的示例中,您需要对其进行转义,以便按字面意思理解其含义。正如其他人所指出的,urlencode() 非常适合。

    【讨论】:

      【解决方案5】:

      您需要转义该字符,因为浏览器通常将其用作hashtag 以滚动到某些元素。

      在 PHP 中,您可以在查询字符串上使用 urlencode() 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-14
        • 2015-11-22
        • 2014-02-04
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多