php获取当前页面完整URL地址


Posted in PHP onDecember 30, 2015

使用PHP编写程序的时候,我们常常想要获取当前页面的URL。下面提供一个用于获取当前页面URL的函数以及使用方法:
示例一:

<?php
// 说明:获取完整URL

function curPageURL() 
{
  $pageURL = 'http';

  if ($_SERVER["HTTPS"] == "on") 
  {
    $pageURL .= "s";
  }
  $pageURL .= "://";

  if ($_SERVER["SERVER_PORT"] != "80") 
  {
    $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
  } 
  else 
  {
    $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
  }
  return $pageURL;
}
?>

定义该函数之后就可以直接调用了:

<?php
 echo curPageURL();
?>

上面的函数可以获取当前页面完整的URL,即你在浏览器地址栏看到的内容。但是,有时候我们不想要URL中的参数( ? 号后面的内容),如:http://www.ludou.org/hello.html?u=123,只想获取http://www.ludou.org/hello.html,你可以将以上函数按示例二修改。

示例二:

<?php
// 说明:获取无参数URL

function curPageURL() 
{
  $pageURL = 'http';

  if ($_SERVER["HTTPS"] == "on") 
  {
    $pageURL .= "s";
  }
  $pageURL .= "://";

  $this_page = $_SERVER["REQUEST_URI"];
  
  // 只取 ? 前面的内容
  if (strpos($this_page, "?") !== false)
  {
    $this_pages = explode("?", $this_page);
    $this_page = reset($this_pages);
  }

  if ($_SERVER["SERVER_PORT"] != "80") 
  {
    $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $this_page;
  } 
  else 
  {
    $pageURL .= $_SERVER["SERVER_NAME"] . $this_page;
  }
  return $pageURL;
}
?>

当然也可以采用 $_SERVER['PHP_SELF'] (该变量不返回URL中的参数),

示例三:

<?php
// 说明:获取无参数URL

function curPageURL() 
{
  $pageURL = 'http';

  if ($_SERVER["HTTPS"] == "on") 
  {
    $pageURL .= "s";
  }
  $pageURL .= "://";

  if ($_SERVER["SERVER_PORT"] != "80") 
  {
    $pageURL .= $_SERVER["SERVER_NAME"].":" . $_SERVER["SERVER_PORT"] . $_SERVER['PHP_SELF'];
  } 
  else 
  {
    $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER['PHP_SELF'];
  }
  return $pageURL;
}
?>

另外,$_SERVER['REQUEST_URI'] 和 $_SERVER['REQUEST_URL'] 是有稍微区别的:
$_SERVER["REQUEST_URI"] 返回完整的路径,包含参数 ( /directory/file.ext?query=string )
$_SERVER['REQUEST_URL'] 只返回文件路径,不包括参数,( /directory/file.ext ),和 $_SERVER['PHP_SELF'] 差不多,只不过在有些服务器上$_SERVER['REQUEST_URL']不可用!

注意:URL使用rewrite规则的时候,$_SERVER['PHP_SELF'] 和 $_SERVER["REQUEST_URL"] 可能不会返回你想要的东西

最后提醒一点,$_SERVER["REQUEST_URI"] 只有 apache 才支持,想要获取$_SERVER['REQUEST_URI'] 值,可以使用以下方案:

<?php
// 说明:获取 _SERVER['REQUEST_URI'] 值的通用解决方案
function request_uri()
{
  if (isset($_SERVER['REQUEST_URI']))
  {
    $uri = $_SERVER['REQUEST_URI']; 
  }
  else
  {
    if (isset($_SERVER['argv']))
    {
      $uri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['argv'][0];
    }
    else
    {
      $uri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING'];
    }
  }
  return $uri;
}
?>

再为大家分享两种解决方法:

第一种方法:

<?php
/**
 * 获取当前页面完整URL地址
 */
function get_url() {
  $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
  $php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
  $path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
  $relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
  return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
 
echo get_url();
?>

第二种方法:

  • javascript实现
top.location.href  顶级窗口的地址
this.location.href 当前窗口的地址
  • PHP实现
#测试网址:   http://localhost/blog/testurl.php?id=5
//获取域名或主机地址 
echo $_SERVER['HTTP_HOST']."<br>"; #localhost

//获取网页地址 
echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php

//获取网址参数 
echo $_SERVER["QUERY_STRING"]."<br>"; #id=5

//获取用户代理 
echo $_SERVER['HTTP_REFERER']."<br>"; 

//获取完整的url
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
#http://localhost/blog/testurl.php?id=5

//包含端口号的完整url
echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
#http://localhost:80/blog/testurl.php?id=5

//只取路径
$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; 
echo dirname($url);
#http://localhost/blog

希望本文所述对大家学习php程序设计有所帮助。

PHP 相关文章推荐
PHP 最大运行时间 max_execution_time修改方法
Mar 08 PHP
一个PHP分页类的代码
May 18 PHP
php实现利用phpexcel导出数据
Aug 24 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 #PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 #PHP
yii,CI,yaf框架+smarty模板使用方法
Dec 29 #PHP
WordPress中自定义后台管理界面配色方案的小技巧
Dec 29 #PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 #PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 #PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 #PHP
You might like
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Python过滤序列元素的方法
2020/07/31 Python
Python如何使用input函数获取输入
2020/08/06 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
.NET概念性的面试题
2012/02/29 面试题
物业管理大学生个人的自我评价
2013/10/10 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
公务员年度个人总结
2015/02/12 职场文书
大学学生个人总结
2015/02/15 职场文书
美丽的大脚观后感
2015/06/03 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
详解Go与PHP的语法对比
2021/05/29 PHP
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL