Правила mod_rewrite и PHP?

Столкнулся с вопросом, который не до конца понимаю


Есть сайт на PHP. Попросили написать rewrite правила, но я уперся в поведение PHP, которого не понимаю.

Итак, что нужно. Чтобы ссылка example.com/forum/blog/0/lalala была сокращена до example.com/blog/lalala

Т.е человек набирает в браузере example.com/blog/lalala и у него эта ссылка открывается без изменения пути в бразуере но обрабатывается по пути example.com/forum/blog/0/lalala


Причем есть 2 файла .htaccess, один по пути /.htaccess, другой /forum/.htaccess (относительно корня сайта)

Оба использутся для конструкции

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?/$1 [L]


При попытке использовать правило

RewriteCond %{REQUEST_URI} ^/blog/(.+)$ [NC]

RewriteRule ^(.*)$ /forum/blog/0/%1 [L]


Оно редиректит до обработчика /forum/index.php, Но в него передается только первичный URI. Т.е. print REQUEST_URI из php показывает /blog/lalala

А если выключить RewriteRule ^(.*)$ index.php?/$1 [L] то показвает 404 с путем /forum/blog/0/lalala.

Получается когда все правила включены — оно рерайтит адрес, делает internal redirect но в PHP все равно попадает первичный адрес из браузера!


А если включить флаг R в мое правило — то есть редирект, то все работает, но по несокращенному адресу.


И вот таки вопрос — а это вообще возможно — без видимого пользователю редиректа сделать это? Этакий ремап адреса?
  • Вопрос задан
  • 6303 просмотра
Решения вопроса 1
intnzy
@intnzy Автор вопроса
Oказалось, что после Internal Redirect в mod_rewrite новый переписанный линк содержится в REDIRECT_URL. Так, собственно, проблема и решилась. Обработчик в скрипте исправлен на использование REDIRECT_URL вместе с REQUEST_URI}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
colonel
@colonel
Разработчик PHP, Laravel
но я уперся в поведение PHP, которого не понимаю.

PHP тут не при чем
Ответ написан
Комментировать
Methos
@Methos
RewriteRule ^\/blog\/(.*)\/?$ /forum/blog/0/$1 [QSA,L]

до всех ваших указанных правил.
Ответ написан
AmdY
@AmdY
PHP и прочие вебштучки
Новое правило поместите выше старых. уберите из него L, получается что новое перепишет урл, на старый, затем спокойно вызовется старое, которое направит всё на index.php.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы