如何使用PHP在地址栏上获取完整的URL

时间:2011-01-22 13:50:11

标签: php javascript

  

可能重复:
  Get entire URL, including query string and anchor

我的网址如 www.domain.com /#!/ username (就像在twitter中一样)。

如何检索完整的URL(上面的整个字符串),包括'#!'后面的子字符串在地址中使用PHP或Javascript ??

5 个答案:

答案 0 :(得分:4)

在JavaScript中,除非您有其他内容,否则您应该可以从document.location获取完整的网址,(例如var URLstring = document.location;)。

在PHP中,正如其他人所说,这是不可能的,因为哈希的工作方式(它在页面内导航,并且不会触发页面重新加载,因此服务器永远不会知道它,除非JS调用Ajax触发服务器上脚本的函数。)

答案 1 :(得分:1)

散列(#)之后的部分永远不会发送到服务器,因此您永远不会收到返回PHP的“完整”URL。 #之后的部分仅在客户端使用,只能从服务器发送到客户端。

答案 2 :(得分:1)

浏览器不会将URL的哈希部分(#和后面的所有内容)发送到服务器,因此PHP无法使用它。

如果您绝对需要服务器端知道它,唯一的方法是加载包含读取哈希值的Javascript的中间页面,并在常规HTTP参数中包含值的另一个请求。例如。中间页面可能是这样的:

<html>
    <!-- snip.. -->
    <body>
        <script type="text/javascript">
            $(document).ready(function() {
                $.get('realContent.php?hash=' + location.hash, 
                    function(data) {
                        $('#content').html(data);
                     }
                );
             }
        </script>
        <div id="content"></div>
    </body>
</html>

答案 3 :(得分:1)

我使用此函数(PHP 5.2)::

function getInstance($uri = 'SERVER')
    {

        if ($uri == 'SERVER')
        {
            if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) {
                $https = 's://';
            } else {
                $https = '://';
            }

            if (!empty ($_SERVER['PHP_SELF']) && !empty ($_SERVER['REQUEST_URI'])) {
                $theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

                if (strlen($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], $_SERVER['QUERY_STRING']) === false) {
                    $theURI .= '?'.$_SERVER['QUERY_STRING'];
                }
            }
             else
             {
                $theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
                if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
                    $theURI .= '?' . $_SERVER['QUERY_STRING'];
                }
            }

            $theURI = urldecode($theURI);
            $theURI = str_replace('"', '&quot;',$theURI);
            $theURI = str_replace('<', '&lt;',$theURI);
            $theURI = str_replace('>', '&gt;',$theURI);
            $theURI = preg_replace('/eval\((.*)\)/', '', $theURI);
            $theURI = preg_replace('/[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']/', '""', $theURI);

    }
    echo (string)$theURI;
}

答案 4 :(得分:0)

Sled的回答是你能做到的最好的,但是,没有办法在英镑符号“#”后得到文字。 “#”之后的任何内容都被视为锚点,并且不会发送到服务器。 “#”仅由浏览器解释。你可以尝试一些Javascript技巧,但我建议避免在“#”之后传递数据。