uri-router.php
См. документацию.
1 <?php
2 
3 /**
4  * @file
5  * @brief Маршрутизатор. uri контроллер, который отвечает за маршрутизацию http запроса к соответствующей модели.
6  */
7 
8 routing_start:
9 
10 if ($request == '/forbidden') {
11  ob_clean();
12 }
13 
14 if (preg_match('#//#', $request)) { // убираем 2 и более слешей в url
15  $uri = preg_replace('#[/]+$#', '', $request);
16  $uri = preg_replace('#[/]{2,}#', '/', $uri);
17  $uri = $uri ?: '/';
18  if ($QUERY_STRING = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY)) {
19  $uri .= '?' . $QUERY_STRING;
20  }
21  header("HTTP/1.1 301 Moved Permanently");
22  header("Location: $uri");
23  exit;
24 }
25 
26 if ($request != '/' && preg_match('#/$#', $request)) { // убираем крайний слеш если это не главная
27  $uri = preg_replace('#[/]+$#', '', $request);
28  if (file_exists($_SERVER['DOCUMENT_ROOT'] . $uri)) {
29  if ($request == '/docs/') {
30  require $_SERVER['DOCUMENT_ROOT'] . '/docs/index.html';
31  exit;
32  }
33  require $_SERVER['DOCUMENT_ROOT'] . '/page/404.php';
34  }
35  $uri = $uri ?: '/';
36  if ($QUERY_STRING = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY)) {
37  $uri .= '?' . $QUERY_STRING;
38  }
39  header("HTTP/1.1 301 Moved Permanently");
40  header("Location: $uri");
41  exit;
42 }
43 
44 if (preg_match('#index\.(php|html)$#', $request)) {
45  header("HTTP/1.1 301 Moved Permanently");
46  header("Location: " . dirname($request));
47  exit;
48 }
49 
50 if (Wrong\Start\Env::$e->SYSTEM_CLOSED && $user->main_group_id != 1) { // система закрыта всем кроме группы Система(основной администратор)
51  $request = '/forbidden';
52 }
53 
54 if (preg_match('#^/api/(modal|action|select)/[a-z0-9\-]+#', $request, $matches)) { // включение запросов к модалкам/дейсвиям/выборкам
55  if ($arr = Wrong\Database\Controller::all($request, 'request', $matches[1] . 's')) {
57  $arr = array_filter($arr, function ($row) use ($user) {
58  return $user->access()->read($row);
59  });
60  if (!$arr) {
61  $request = '/forbidden';
62  goto routing_start;
63  }
64  foreach ($arr as $row) {
65  if (file_exists($_SERVER['DOCUMENT_ROOT'] . $row->file)) {
66  header("X-Robots-Tag: noindex");
67  $basename = basename($request);
68 
69  if (strpos($request, '/api/select') !== false && $row->cache_time) { // если кешируется
70  $mem = new Wrong\Memory\Cache('api-select');
71  if ($data = $mem->get($_SERVER['REQUEST_URI'], $row->cache_time)) { // если есть в кеше отдаём из кеша
72  exit($data);
73  }
74  register_shutdown_function(function ($mem, $timeout) {
75  $mem->set($_SERVER['REQUEST_URI'], ob_get_contents(), $timeout);
76  }, $mem, $row->cache_time);
77  }
78 
79  require $_SERVER['DOCUMENT_ROOT'] . $row->file;
80  exit;
81  }
82  }
83  }
84 }
85 
86 
87 if (isset($_GET['FROM_UID'])) { // переадресация на главную и сброс "гостевой" сессии
88  !empty($_COOKIE['FROM_UID']) && Wrong\Auth\User::session_reset();
89  $user = new Wrong\Auth\User(Wrong\Auth\User::session());
90  if ($user->access()->page('/system')) {
91  header("Location: /system");
92  } else {
93  header("Location: /");
94  }
95  exit;
96 }
97 
98 if ($request == '/' && Wrong\Start\Env::$e->RETURN_TO_REQUEST && $user->id && $request != $user->request && $user->request && !isset($_GET['main'])) { // переадресация не предыдущий url
99  header("Location: $user->request");
100  exit;
101 }
102 
103 if (preg_match('#^/remind/([0-9]+)/([a-z0-9]+)#i', $request, $matches) && Wrong\Auth\User::is_remind($matches[1], $matches[2])) { // восставновление пароля
104  header("X-Robots-Tag: noindex");
106  _modal("#sign-remind", null, "user_id=' . $matches[1] . '&md5=' . $matches[2] . '");
107  history.pushState(null, null, "/");
108  ', 0, 'sign-remind');
109  $request = '/';
110 }
111 
112 if (preg_match('#^/email-confirm/([0-9]+)/([a-z0-9]+)#i', $request, $matches) && Wrong\Auth\User::is_confirm($matches[1], $matches[2]) && !$user->email_confirmed) { // подтверждение email
113  header("X-Robots-Tag: noindex");
114  Wrong\Task\Stackjs::add('history.pushState(null, null, "/");setTimeout(()=>{successToast("Почта успешно подтверждена");},100)', 0, 'email-confirm');
115  $user->set_confirm(1);
116  if ($user->access()->page('/system')) {
117  header("Location: /system");
118  } else {
119  header("Location: /");
120  }
121  exit;
122 }
123 
124 if (Wrong\Start\Env::$e->EMAIL_CONFIRMATION && $user->id && !$user->email_confirmed) { // окно подтверждения email
125  $request = '/disabled';
126  Wrong\Task\Stackjs::add('_modal("#email-confirm");', 0, 'email-confirm');
127 }
128 
129 if ($arr = Wrong\Models\Pages::all($request, 'request')) { // запросы к url страницам
131  $arr = array_filter($arr, function ($row) use ($user) {
132  return $user->access()->read($row);
133  });
134  if (!$arr && $request != '/forbidden') {
135  $request = '/forbidden';
136  goto routing_start;
137  }
138  foreach ($arr as $row) {
139  if (file_exists($_SERVER['DOCUMENT_ROOT'] . $row->file)) {
140  if (
141  ($template = Wrong\Models\Templates::find($row->template_id)) &&
142  $user->access()->read($template) &&
143  file_exists($_SERVER['DOCUMENT_ROOT'] . $template->file)
144  ) { // шаблон доступен
145  if ($row->cache_time) { // если страница кешируется
146  $mem = new Wrong\Memory\Cache('page-cache');
147  if ($data = $mem->get($_SERVER['REQUEST_URI'], $row->cache_time)) { // если есть в кеше отдаём из кеша
148  exit($data);
149  }
150  register_shutdown_function(function ($mem, $timeout) {
151  $mem->set($_SERVER['REQUEST_URI'], ob_get_contents(), $timeout);
152  }, $mem, $row->cache_time);
153  }
154 
155  if ($template->cache_time) { // если шаблон кешируется
156  $mem = new Wrong\Memory\Cache('template-cache');
157  if ($data = $mem->get($_SERVER['REQUEST_URI'], $template->cache_time)) { // если есть в кеше отдаём из кеша
158  exit($data);
159  }
160  register_shutdown_function(function ($mem, $timeout) {
161  $mem->set($_SERVER['REQUEST_URI'], ob_get_contents(), $timeout);
162  }, $mem, $template->cache_time);
163  }
164 
165  require $_SERVER['DOCUMENT_ROOT'] . $template->file;
166  } else if ($request != '/forbidden') { // шаблон недоступен - 403
167  $request = '/forbidden';
168  goto routing_start;
169  }
170  $user->set_request($request);
171  exit;
172  }
173  }
174 }
175 
176 
177 
178 
179 /**
180  * пример запроса к динамическим страницам
181  * my-categories - таблица в бд с вашими категориями
182  * my-pages - таблица в бд с вашим контентом страниц
183  * url - поля в бд ваших категорий и страниц
184  *
185  * /request-dinamic-model-name - ваша модель страницы
186  *
187  * $data_page - данные вашей страницы, которые будут доступны в контексте её файла
188  * /any-category-url/any-page-url - запросы по которым будет доступна ваша динамическая модель
189  */
190 
191 // $rx = "#^/(" . implode('|', array_column(Wrong\Database\Controller::all('', 'id', 'my-categories'), 'url')) . ")/([^/]+)$#";
192 // if (
193 // preg_match($rx, $request, $matches) &&
194 // ($data_page = Wrong\Database\Controller::find($matches[2], 'url', 'my-pages')) && ($arr = Wrong\Models\Pages::all('/request-dinamic-model-name', 'request'))
195 // ) {
196 // $arr = Wrong\Rights\Group::weightSort($arr);
197 // $arr = array_filter($arr, function ($row) use ($user) {
198 // return $user->access()->read($row);
199 // });
200 // if (!$arr) {
201 // $request = '/forbidden';
202 // goto routing_start;
203 // }
204 // foreach ($arr as $row) {
205 // if (file_exists($_SERVER['DOCUMENT_ROOT'] . $row->file)) {
206 // if (
207 // ($template = Wrong\Models\Templates::find($row->template_id)) &&
208 // $user->access()->read($template) &&
209 // file_exists($_SERVER['DOCUMENT_ROOT'] . $template->file)
210 // ) { // шаблон доступен
211 // require $_SERVER['DOCUMENT_ROOT'] . $template->file;
212 // } else if ($request != '/forbidden') { // шаблон недоступен - 403
213 // $request = '/forbidden';
214 // goto routing_start;
215 // }
216 // $user->set_request($request);
217 // exit;
218 // }
219 // }
220 // }
221 
222 
223 
224 
225 require $_SERVER['DOCUMENT_ROOT'] . '/page/404.php'; // контроллер не нашел подходящей модели
$mem
Definition: settings.php:129
if(! $response->_meta) $data
Definition: anycomment.php:18
User отвечает за работу с данными пользователя
Definition: User.php:21
static session_reset()
Definition: User.php:184
Cache класс, отвечающий за кеширование
Definition: Cache.php:19
static weightSort($arr)
Definition: Group.php:136
static add($code, $timeout=0, $key='')
Definition: Stackjs.php:25
$user
Definition: from-user.php:38
setcookie('FROM_UID', $uid, [ 'expires'=> time()+31536000, 'path'=> '/', 'domain'=> $_SERVER['HTTP_HOST'], 'secure'=> Wrong\Start\Env::$e->IS_SECURE, 'httponly'=> false, 'samesite'=> Wrong\Start\Env::$e->IS_SECURE ? 'None' :'Lax']) or setcookie('FROM_UID' $_SERVER['HTTP_HOST']
Definition: from-user.php:36
if(($dbh=Connect::getInstance(true) ->dbh) && $dbh->query("SHOW TABLES") ->fetchAll() && $dbh->query("SELECT COUNT(*) FROM `users`") ->fetchColumn()) if(!empty($_POST)) exit
Definition: install.php:198
$arr
Definition: actions.php:25
catch(\Throwable $th) $request
Definition: session.php:28