PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/main/include/urlrewrite.php

https://gitlab.com/alexprowars/bitrix
PHP | 174 lines | 139 code | 32 blank | 3 comment | 48 complexity | 62f9f65a70d42205c78f7e444e3c2ad4 MD5 | raw file
  1. <?
  2. error_reporting(E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR|E_PARSE);
  3. require_once(__DIR__."/../bx_root.php");
  4. require_once(__DIR__."/../lib/loader.php");
  5. require_once(__DIR__."/autoload.php");
  6. require_once(__DIR__."/../tools.php");
  7. $bSkipRewriteChecking = false;
  8. //try to fix REQUEST_URI under IIS
  9. $aProtocols = array('http', 'https');
  10. foreach($aProtocols as $prot)
  11. {
  12. $marker = "404;".$prot."://";
  13. if(($p = mb_strpos($_SERVER["QUERY_STRING"], $marker)) !== false)
  14. {
  15. $uri = $_SERVER["QUERY_STRING"];
  16. if(($p = mb_strpos($uri, "/", $p + mb_strlen($marker))) !== false)
  17. {
  18. if($_SERVER["REQUEST_URI"] == '' || $_SERVER["REQUEST_URI"] == '/404.php' || mb_strpos($_SERVER["REQUEST_URI"], $marker) !== false)
  19. {
  20. $_SERVER["REQUEST_URI"] = $REQUEST_URI = mb_substr($uri, $p);
  21. }
  22. $_SERVER["REDIRECT_STATUS"] = '404';
  23. $_SERVER["QUERY_STRING"] = $QUERY_STRING = "";
  24. $_GET = array();
  25. break;
  26. }
  27. }
  28. }
  29. if (!defined("AUTH_404"))
  30. define("AUTH_404", "Y");
  31. require_once($_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/php_interface/dbconn.php");
  32. if (defined("BX_URLREWRITE"))
  33. return;
  34. define("BX_URLREWRITE", true);
  35. $foundQMark = mb_strpos($_SERVER["REQUEST_URI"], "?");
  36. $requestUriWithoutParams = ($foundQMark !== false? mb_substr($_SERVER["REQUEST_URI"], 0, $foundQMark) : $_SERVER["REQUEST_URI"]);
  37. $requestParams = ($foundQMark !== false? mb_substr($_SERVER["REQUEST_URI"], $foundQMark) : "");
  38. //decode only filename, not parameters
  39. $requestPage = urldecode($requestUriWithoutParams);
  40. if(!defined("BX_UTF") && CUtil::DetectUTF8($_SERVER["REQUEST_URI"]))
  41. {
  42. $requestPage = \Bitrix\Main\Text\Encoding::convertEncoding($requestPage, "utf-8", (defined("BX_DEFAULT_CHARSET")? BX_DEFAULT_CHARSET : "windows-1251"));
  43. }
  44. $requestUri = $requestPage.$requestParams;
  45. $io = CBXVirtualIo::GetInstance();
  46. $arUrlRewrite = array();
  47. if(file_exists($_SERVER['DOCUMENT_ROOT']."/urlrewrite.php"))
  48. include($_SERVER['DOCUMENT_ROOT']."/urlrewrite.php");
  49. if((isset($_SERVER['REDIRECT_STATUS']) && $_SERVER['REDIRECT_STATUS'] == '404') || isset($_GET["SEF_APPLICATION_CUR_PAGE_URL"]))
  50. {
  51. if(isset($_SERVER['REDIRECT_STATUS']) && $_SERVER['REDIRECT_STATUS'] == '404' && !isset($_GET["SEF_APPLICATION_CUR_PAGE_URL"]))
  52. {
  53. $url = $requestUri;
  54. }
  55. else
  56. {
  57. if(!is_string($_GET["SEF_APPLICATION_CUR_PAGE_URL"]))
  58. {
  59. $_GET["SEF_APPLICATION_CUR_PAGE_URL"] = '';
  60. }
  61. $url = $requestUri = $_GET["SEF_APPLICATION_CUR_PAGE_URL"];
  62. $_SERVER["REQUEST_URI"] = $REQUEST_URI = CHTTP::urnEncode($_GET["SEF_APPLICATION_CUR_PAGE_URL"]);
  63. unset($_GET["SEF_APPLICATION_CUR_PAGE_URL"]);
  64. }
  65. if(($pos = mb_strpos($url, "?")) !== false)
  66. {
  67. $params = mb_substr($url, $pos + 1);
  68. if ($params !== false && $params !== "")
  69. {
  70. parse_str($params, $vars);
  71. unset($vars["SEF_APPLICATION_CUR_PAGE_URL"]);
  72. $_GET += $vars;
  73. $_REQUEST += $vars;
  74. if (ini_get_bool("register_globals"))
  75. $GLOBALS += $vars;
  76. $_SERVER["QUERY_STRING"] = $QUERY_STRING = CHTTP::urnEncode($params);
  77. }
  78. }
  79. if (isset($_GET["SEF_APPLICATION_CUR_PAGE_URL"])
  80. && (
  81. isset($_SERVER['REDIRECT_STATUS']) && $_SERVER['REDIRECT_STATUS'] == '404'
  82. || ($requestUriWithoutParams != "/bitrix/urlrewrite.php")
  83. )
  84. )
  85. {
  86. $url = $requestUri = $_SERVER["REQUEST_URI"] = $REQUEST_URI = "";
  87. $_GET = array();
  88. $_REQUEST = array();
  89. $_SERVER["QUERY_STRING"] = $QUERY_STRING = "";
  90. }
  91. $HTTP_GET_VARS = $_GET;
  92. $uriPath = GetRequestUri();
  93. define("POST_FORM_ACTION_URI", htmlspecialcharsbx("/bitrix/urlrewrite.php?SEF_APPLICATION_CUR_PAGE_URL=".urlencode($uriPath)));
  94. }
  95. if (!CHTTP::isPathTraversalUri($_SERVER["REQUEST_URI"]))
  96. {
  97. foreach($arUrlRewrite as $val)
  98. {
  99. if(preg_match($val["CONDITION"], $requestUri))
  100. {
  101. if ($val["RULE"] <> '')
  102. $url = preg_replace($val["CONDITION"], ($val["PATH"] <> '' ? $val["PATH"]."?" : "").$val["RULE"], $requestUri);
  103. else
  104. $url = $val["PATH"];
  105. if(($pos = mb_strpos($url, "?"))!==false)
  106. {
  107. $params = mb_substr($url, $pos + 1);
  108. parse_str($params, $vars);
  109. unset($vars["SEF_APPLICATION_CUR_PAGE_URL"]);
  110. $_GET += $vars;
  111. $_REQUEST += $vars;
  112. $_SERVER["QUERY_STRING"] = $QUERY_STRING = CHTTP::urnEncode($params);
  113. $url = mb_substr($url, 0, $pos);
  114. }
  115. $url = _normalizePath($url);
  116. if(!$io->FileExists($_SERVER['DOCUMENT_ROOT'].$url))
  117. continue;
  118. if (!$io->ValidatePathString($url))
  119. continue;
  120. $urlTmp = mb_strtolower(ltrim($url, "/\\"));
  121. $urlTmp = str_replace(".", "", $urlTmp);
  122. $urlTmp7 = mb_substr($urlTmp, 0, 7);
  123. if (($urlTmp7 == "upload/" || ($urlTmp7 == "bitrix/" && mb_substr($urlTmp, 0, 16) != "bitrix/services/" && mb_substr($urlTmp, 0, 18) != "bitrix/groupdavphp")))
  124. continue;
  125. $ext = mb_strtolower(GetFileExtension($url));
  126. if ($ext != "php")
  127. continue;
  128. CHTTP::SetStatus("200 OK");
  129. $_SERVER["REAL_FILE_PATH"] = $url;
  130. include_once($io->GetPhysicalName($_SERVER['DOCUMENT_ROOT'].$url));
  131. die();
  132. }
  133. }
  134. }
  135. //admin section 404
  136. if(mb_strpos($requestUri, "/bitrix/admin/") === 0)
  137. {
  138. $_SERVER["REAL_FILE_PATH"] = "/bitrix/admin/404.php";
  139. include($_SERVER["DOCUMENT_ROOT"]."/bitrix/admin/404.php");
  140. die();
  141. }
  142. define("BX_CHECK_SHORT_URI", true);