Почему слеш в конце адресной строки ломает сайт, построенный по принципу единой точки входа?

330
21 апреля 2017, 22:08

Реализация по принципу единой точки входа, содержимое адресной строки разбивается $routes = explode('/', $_SERVER['REQUEST_URI']) и результаты передаются в обработчики.

Адресная строка имеет следующий вид: example.com/11/20, где 11 - id пользователя, а 20 - id категории.

Записи в .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Возникла проблема с добавлением слеша в конец строки. Например, корректно работают адреса вида

example.com/11
example.com/11/
example.com/11/20

но начинаются проблемы, когда я пытаюсь добавить слеш (и дополнительную переменную) в конец строки:

example.com/11/20/
example.com/11/20/page3

В этом случае index-страница "теряет" стили css, библиотеки js и отображаемые изображения.

Кто-то может объяснить, почему добавление слеша ломает страницу, а главное, почему это происходит на определенном уровне вложенности (например, добавить слеш так - example.com/11/ - еще можно, а так - example.com/11/20/ - уже нельзя)? Это как-то можно исправить?

UPD.

Обработка всех routes происходит одинаково, т.е. во всех случаях подгружается index.php и переменной присваивается получаемое в результате разбора строки значение:

 if(!empty($routes[1])) {         //если это не главная страница всего сервиса
  if(intval($routes[1])) {       //если это страница пользователя, а не, например, поиск
   $user_id = intval($routes[1]) ;  
   if (empty($routes[2])) {   //если запрос главной страницы или категории (не контакты, не поиск ...)
    require "html/index.php";
   //some code
   require "html/index.php";
   $page = $routes[3];

Проблема частично решена тем, что в подгружаемом index.php в строках вида href="../css/style.css" убрал переход на уровень вверх, т.е. заменил на href="/css/style.css" (без точек впереди). Написал "частично решена", потому что теперь код работать-то работает и со слешем и без одинаково, но я не понимаю причин такого поведения и такой избирательности (за код прошу не пинать).

Answer 1

Если проблема только в статике, то необходимо указывать полный путь, так как все запросы идут к ./index.php, а для браузера путь будет всегда вроде этого example.com/11/20/page3/css/style.css

READ ALSO
Advanced Custom Fields, двойное сохранение поля

Advanced Custom Fields, двойное сохранение поля

Подскажите, почему поле из плагина acf сохраняется дважды? Подозреваю, что срабатывает стандартный хук save_post и хук acf/save_post одновременноНужно...

274
Как сделать скрытую переадресацию?

Как сделать скрытую переадресацию?

скажем у меня есть два доменных именни: onecom и two

224
При аплоде картинки microtime дает разные значения

При аплоде картинки microtime дает разные значения

Подскажите нужно сделать имя файла уникальным с помощью microtime и делая

213
Dynamic php pagination ajax

Dynamic php pagination ajax

Нужно к этому коду адаптировать pagination переключение с помощью ajax, вот пример и код:

211