Url.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace Qii\Request;
  3. /**
  4. * 返回URL处理方法
  5. */
  6. class Url
  7. {
  8. /**
  9. * self instance
  10. */
  11. private static $_instance;
  12. public $request;
  13. public function __construct($rewriteRule = 'Normal')
  14. {
  15. $allow = array('Normal', 'Middle', 'Short');
  16. if (!in_array($rewriteRule, $allow)) {
  17. throw new \Qii\Exceptions\Unsupport("链接模式错误,链接格式只能为 '<u><font color=\"green\">" . join("', '", $allow) . "</font></u>',当前模式为 '<font color=\"red\">" . $rewriteRule . "</font>'", __LINE__);
  18. }
  19. $className = 'Qii\Request\Url\\' . $rewriteRule;
  20. $this->request = \Qii\Autoloader\Psr4::getInstance()->loadClass($className, $rewriteRule);
  21. return $this;
  22. }
  23. public static function getInstance()
  24. {
  25. $args = func_get_args();
  26. $arg = array_shift($args);
  27. if (self::$_instance == null) {
  28. self::$_instance = new self($arg);
  29. }
  30. return self::$_instance;
  31. }
  32. /**
  33. * 获取当前连接地址
  34. *
  35. */
  36. public static function getCurrentURL()
  37. {
  38. $rewriteRule = \Qii::getInstance()->appConfigure(\Qii\Config\Consts::APP_SITE_METHOD);
  39. return \Qii\Request\Url::getInstance($rewriteRule)->request->getCurrentURL();
  40. }
  41. /**
  42. * 获取网站路径的URL
  43. * @return string
  44. */
  45. public static function pathUrl()
  46. {
  47. $rewriteRule = \Qii::getInstance()->appConfigure(\Qii\Config\Consts::APP_SITE_METHOD);
  48. return \Qii\Request\Url::getInstance($rewriteRule)->request->getWebHost() . \Qii::getInstance()->request->url->getPath();
  49. }
  50. /**
  51. * 获取文件的路径
  52. * @param String $file
  53. * @return String
  54. */
  55. public static function getFile($file)
  56. {
  57. return self::pathUrl() . '/' . ltrim($file, '/');
  58. }
  59. /**
  60. * 将绝对地址补成全路径URL
  61. * @param String $url
  62. * @return string
  63. */
  64. public static function getFullUrl($url = 'index', $ext = '.html')
  65. {
  66. if (is_array($url)) {
  67. $url = join('/', $url);
  68. }
  69. $url = str_replace('//', '/', $url);
  70. $query = parse_url($url);
  71. $url = $query['path'];
  72. $params = array();
  73. if (isset($query['query'])) {
  74. parse_str($query['query'], $params);
  75. }
  76. if ($url == '/') $url = 'index';
  77. if ($ext == null) {
  78. $ext = '';
  79. }
  80. $query = count($params) > 0 ? '?' . http_build_query($params) : '';
  81. //去掉url中末尾的扩展名,避免重复
  82. $url = preg_replace('/' . $ext . '$/', '', $url);
  83. return rtrim(self::pathUrl(), '/') . '/' . ltrim($url, '/') . $ext . (count($params) > 0 ? '?' . http_build_query($params) : '');
  84. }
  85. /**
  86. * 返回url的全路径
  87. * @param string $url url格式为路径如:publish/edit.json?isAjax=1&ad_uuid=1912-1212-1212-1112-123
  88. */
  89. public static function getAbsluteUrl($url)
  90. {
  91. return self::getFullUrl($url, '');
  92. }
  93. /**
  94. * 通过path直接返回全路径
  95. *
  96. * @param $url
  97. * @return string
  98. */
  99. public static function getSourceFullUrl($url)
  100. {
  101. $ext = pathinfo($url, PATHINFO_EXTENSION);
  102. $url = preg_replace('/' . $ext . '$/', '', $url);
  103. return self::getFullUrl($url, $ext);
  104. }
  105. /**
  106. * 获取来源地址
  107. */
  108. public static function getRefererURL()
  109. {
  110. return isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
  111. }
  112. /**
  113. * 来源地址是否是当前网站
  114. * @param string $currentURL 需要验证的网址,不传默认当前网址
  115. * @return bool
  116. */
  117. public static function refererFromCurrentSite($currentURL = null)
  118. {
  119. $referer = self::getRefererURL();
  120. if(!$currentURL) $currentURL = self::getCurrentURL();
  121. if(parse_url($referer, PHP_URL_HOST) != parse_url($currentURL, PHP_URL_HOST)){
  122. return false;
  123. }
  124. return true;
  125. }
  126. /**
  127. * 先看本方法中有没有静态方法可调用
  128. */
  129. public function __call($method, $args)
  130. {
  131. if(method_exists($this, $method))
  132. {
  133. return call_user_func_array(array(self, $method), $args);
  134. }
  135. return call_user_func_array(array($this->request, $method), $args);
  136. }
  137. }