在PHP中获取完整的URL

我使用此代码来获取完整的网址:

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

问题是我在.htaccess使用了一些掩码,所以我们在URL中看到的并不总是文件的真实路径。

我需要的是获取URL,URL中写入的内容,没有其他的东西 - 完整的URL。

我需要了解它是如何出现在浏览器的导航栏中的,而不是服务器上文件的真实路径。


看看$_SERVER['REQUEST_URI'] ,即

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

(请注意,双引号字符串语法是完全正确的)

如果你想同时支持HTTP和HTTPS,你可以使用

$actual_link = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

编者按:使用此代码有安全隐患 。 客户端可以将HTTP_HOST和REQUEST_URI设置为任意值。


短版本输出网页上的链接

$url =  "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );
echo '<a href="' . $escaped_url . '">' . $escaped_url . '</a>';

以下是关于//example.com/path/格式的问题和边缘情况的更多详细信息

完整版

function url_origin( $s, $use_forwarded_host = false )
{
    $ssl      = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
    $sp       = strtolower( $s['SERVER_PROTOCOL'] );
    $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
    $port     = $s['SERVER_PORT'];
    $port     = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
    $host     = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );
    $host     = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;
    return $protocol . '://' . $host;
}

function full_url( $s, $use_forwarded_host = false )
{
    return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];
}

$absolute_url = full_url( $_SERVER );
echo $absolute_url;

这是http://snipplr.com/view.php?codeview&id=2734的重大修改版本。

网址结构:

scheme:// username:password @domain:port / path?query_string# fragment_id

粗体部分不包含在功能中

笔记:

  • 此函数不包含来自完整URL或碎片(哈希)的username:password
  • 它不会显示HTTP的默认端口80和HTTPS的端口443。
  • 只用http和https方案进行测试。
  • #fragment_id不会被客户端(浏览器)发送到服务器,也不会被添加到完整的URL中。
  • $_GET只包含foo=bar2 ,例如/example?foo=bar1&foo=bar2
  • 某些CMS和环境将重写$_SERVER['REQUEST_URI']并返回/example?foo=bar2 ,例如/example?foo=bar1&foo=bar2 ,在这种情况下使用$_SERVER['QUERY_STRING']
  • 请记住,一个URI = URL + URN ,但由于流行的使用,现在URL意味着URI和URL。
  • 如果您不打算使用代理或平衡器,则应该删除HTTP_X_FORWARDED_HOST
  • 该规范说明, Host头必须包含端口号,除非它是默认号码。
  • 客户端(浏览器)控制变量:

  • $_SERVER['REQUEST_URI'] 。 任何不受支持的字符在发送之前都由浏览器编码。
  • $_SERVER['HTTP_HOST'] ,根据PHP手册中的注释并不总是可用:http://php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST']由平衡器设置,并且在PHP手册中的$_SERVER变量列表中未提及。
  • 服务器控制变量:

  • $_SERVER['HTTPS'] 。 客户选择使用这个,但服务器返回空或“开”的实际值。
  • $_SERVER['SERVER_PORT'] 。 服务器只接受允许的数字作为端口。
  • $_SERVER['SERVER_PROTOCOL'] 。 服务器只接受某些协议。
  • $_SERVER['SERVER_NAME'] 。 它根据kralyk在服务器配置中手动设置,不适用于IPv6。
  • 有关:

    HTTP_HOST与SERVER_NAME
    在HTTP“主机”标题参数中是否需要端口号?
    https://stackoverflow.com/a/28049503/175071


    对于这个问题,用print_r($_SERVER)查看整个数组,你会看到你需要的一切:)

    链接地址: http://www.djcxy.com/p/1121.html

    上一篇: Get the full URL in PHP

    下一篇: How to get the browser to navigate to URL in JavaScript