Url.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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\Unsupported("链接模式错误,链接格式只能为 '<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. * 获取当前请求的URL
  34. *
  35. * @return mixed
  36. */
  37. public static function getPathInfo()
  38. {
  39. if (PATH_INFO) {
  40. return explode("?", PATH_INFO)[0];
  41. }
  42. $path = pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME);
  43. $pathinfo = $_SERVER['REQUEST_URI'];
  44. if (substr($_SERVER['REQUEST_URI'], 0, strlen($path)) == $path) {
  45. $pathinfo = substr($_SERVER['REQUEST_URI'], strlen($path));
  46. }
  47. return explode('?', $pathinfo)[0];
  48. }
  49. /**
  50. * 获取当前连接地址
  51. *
  52. */
  53. public static function getCurrentURL()
  54. {
  55. $rewriteRule = \Qii::getInstance()->appConfigure(\Qii\Config\Consts::APP_SITE_METHOD);
  56. return \Qii\Request\Url::getInstance($rewriteRule)->request->getCurrentURL();
  57. }
  58. /**
  59. * 返回web host
  60. * @return mixed
  61. */
  62. public static function getHost()
  63. {
  64. $rewriteRule = \Qii::getInstance()->appConfigure(\Qii\Config\Consts::APP_SITE_METHOD);
  65. return \Qii\Request\Url::getInstance($rewriteRule)->request->getWebHost();
  66. }
  67. /**
  68. * 获取subdomain
  69. * @return string
  70. */
  71. public static function getSubdomain()
  72. {
  73. $rewriteRule = \Qii::getInstance()->appConfigure(\Qii\Config\Consts::APP_SITE_METHOD);
  74. $host = \Qii\Request\Url::getInstance($rewriteRule)->request->getWebHost();
  75. $domain = parse_url($host)['host'] ?? "";
  76. if (stristr($domain, ".")) {
  77. return explode(".", $domain)[0];
  78. }
  79. return "";
  80. }
  81. /**
  82. * 获取网站路径的URL
  83. * @return string
  84. */
  85. public static function pathUrl()
  86. {
  87. $rewriteRule = \Qii::getInstance()->appConfigure(\Qii\Config\Consts::APP_SITE_METHOD);
  88. return \Qii\Request\Url::getInstance($rewriteRule)->request->getWebHost() . \Qii::getInstance()->request->url->getPath();
  89. }
  90. /**
  91. * 获取文件的路径
  92. * @param String $file
  93. * @return String
  94. */
  95. public static function getFile($file)
  96. {
  97. return self::pathUrl() . '/' . ltrim($file, '/');
  98. }
  99. /**
  100. * 将绝对地址补成全路径URL
  101. * @param String $url
  102. * @return string
  103. */
  104. public static function getFullUrl($url = 'index', $ext = '.html')
  105. {
  106. if (is_array($url)) {
  107. $url = join('/', $url);
  108. }
  109. $url = str_replace('//', '/', $url);
  110. $query = parse_url($url);
  111. $url = $query['path'];
  112. $params = array();
  113. if (isset($query['query'])) {
  114. parse_str($query['query'], $params);
  115. }
  116. if ($url == '/') {
  117. $url = 'index';
  118. }
  119. if ($ext == null) {
  120. $ext = '';
  121. }
  122. //去掉url中末尾的扩展名,避免重复
  123. $url = preg_replace('/' . $ext . '$/', '', $url);
  124. $url = rtrim(self::pathUrl(), '/') . '/' . ltrim($url, '/') . $ext . (count($params) > 0 ? '?' . http_build_query($params) : '');
  125. if (isset($query['fragment']) && !empty($query['fragment'])) {
  126. $url .= "#". $query['fragment'];
  127. }
  128. return $url;
  129. }
  130. /**
  131. * 返回url的全路径
  132. * @param string $url url格式为路径如:publish/edit.json?isAjax=1&ad_uuid=1912-1212-1212-1112-123
  133. */
  134. public static function getAbsluteUrl($url)
  135. {
  136. return self::getFullUrl($url, '');
  137. }
  138. /**
  139. * 通过path直接返回全路径
  140. *
  141. * @param $url
  142. * @return string
  143. */
  144. public static function getSourceFullUrl($url)
  145. {
  146. $ext = pathinfo($url, PATHINFO_EXTENSION);
  147. $url = preg_replace('/' . $ext . '$/', '', $url);
  148. return self::getFullUrl($url, $ext);
  149. }
  150. /**
  151. * 获取来源地址
  152. */
  153. public static function getRefererURL()
  154. {
  155. return isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
  156. }
  157. /**
  158. * 来源地址是否是当前网站
  159. * @param string $currentURL 需要验证的网址,不传默认当前网址
  160. * @return bool
  161. */
  162. public static function refererFromCurrentSite($currentURL = null)
  163. {
  164. $referer = self::getRefererURL();
  165. if (!$currentURL) {
  166. $currentURL = self::getCurrentURL();
  167. }
  168. if (parse_url($referer, PHP_URL_HOST) != parse_url($currentURL, PHP_URL_HOST)) {
  169. return false;
  170. }
  171. return true;
  172. }
  173. /**
  174. * 先看本方法中有没有静态方法可调用
  175. */
  176. public function __call($method, $args)
  177. {
  178. if (method_exists($this, $method)) {
  179. return call_user_func_array(array(self, $method), $args);
  180. }
  181. return call_user_func_array(array($this->request, $method), $args);
  182. }
  183. }