Url.php 5.8 KB

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