在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
粗体部分不包含在功能中
笔记:
username:password
。 #fragment_id
不会被客户端(浏览器)发送到服务器,也不会被添加到完整的URL中。 $_GET
只包含foo=bar2
,例如/example?foo=bar1&foo=bar2
。 $_SERVER['REQUEST_URI']
并返回/example?foo=bar2
,例如/example?foo=bar1&foo=bar2
,在这种情况下使用$_SERVER['QUERY_STRING']
。 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)
查看整个数组,你会看到你需要的一切:)
下一篇: How to get the browser to navigate to URL in JavaScript