Основная проблема в том, что у вас есть директивы в неправильном порядке. Вы должны перенаправить на www.example.com
до переписать на web/<whatever>
.
Например:
RewriteEngine on
# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
# Internally rewrite to "web" subdirectory.
RewriteRule (.*) web/$1 [L]
Я предполагаю, что у вас есть другой файл .htaccess
в подкаталоге /web
, который также использует mod_rewrite - в противном случае последняя директива приведет к циклу перезаписи.
после этого добавьте /en
к URL, чтобы он выглядел как www.example.com/en
Вам нужно сделать это до того, как перезаписать URL в подкаталог web
. Я предполагаю, что вы могли бы запросить www.example.com/<page>
, и это должно перенаправить на www.example.com/en/<page>
?
Попробуйте следующее:
RewriteEngine on
# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=302,L]
# Redirect to "/en" if not already present at the start of the URL
RewriteCond %{REQUEST_URI} !^/en/
RewriteRule (.*) http://%{HTTP_HOST}/en/$1 [R=302,L]
# Internally rewrite to "web" subdirectory.
RewriteRule (.*) web/$1 [L]
Директива RewriteCond
проверяет, что URL-путь (!
) не начинается с /en/
перед перенаправлением.
Примечание. Я изменил перенаправления на 302 (временно). Прежде чем использовать 301, сначала проверьте 302, чтобы избежать проблем с кэшированием в браузере. И обязательно проверяйте кеш браузера перед тестированием.