Столкнулся с вопросом, который не до конца понимаю
Есть сайт на 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 в мое правило — то есть редирект, то все работает, но по несокращенному адресу.
И вот таки вопрос — а это вообще возможно — без видимого пользователю редиректа сделать это? Этакий ремап адреса?
UPD. Oказалось, что после Internal Redirect в mod_rewrite новый переписанный линк содержится в REDIRECT_URI. Так, собственно, проблема и решилась. Обработчик в скрипте исправлен на использование REDIRECT_URI.
Oказалось, что после Internal Redirect в mod_rewrite новый переписанный линк содержится в REDIRECT_URL. Так, собственно, проблема и решилась. Обработчик в скрипте исправлен на использование REDIRECT_URL вместе с REQUEST_URI}
Новое правило поместите выше старых. уберите из него L, получается что новое перепишет урл, на старый, затем спокойно вызовется старое, которое направит всё на index.php.