Я бы вообще удалил файл .htaccess
в подкаталоге /web
и переписал бы прямо в /web/index.php
в корневом .htaccess
файле.Имея два .htaccess
файла, вы создаете дополнительную работу.Директивы mod_rewrite в подкаталоге будут полностью переопределять родительские директивы (по умолчанию), поэтому ваши канонические перенаправления HTTPS и www также переопределяются.
(Предположительно, у вас была директива RewriteEngine On
в файле /web/.htaccess
?)
Удалив файл /web/.htaccess
, попробуйте что-то вроде следующего в своем корневом .htaccess
файле:
Options -Indexes -MultiViews
RewriteEngine On
RewriteBase /web
# Redirect to https & www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=302,L,NE]
# If /web or /index.php is present at the start of the requested URL then remove it (via redirect)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(?:web|index\.php)/(.*) /$1 [R=302,L]
# Front-controller...
# Internally rewrite all requests to /web/index.php (uses RewriteBase set above)
RewriteRule index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Проверка переменной среды REDIRECT_STATUS
гарантирует, что мы толькопроверять первоначальные запросы, а не запросы, которые были позже переписаны.
Оболочка <IfModule>
не требуется, если только ваш сайт не предназначен для работы без mod_rewrite.
Обратите внимание, что запрос похож на /web/index.php/page/
приведет к двум перенаправлениям.Сначала /index.php/page
, затем /page
.Поскольку это крайний случай, я бы посчитал приемлемым двойное перенаправление.
ОБНОВЛЕНИЕ: Я удалил проверку "directory" в приведенном выше примере, так как это предотвратило бы корень документа(example.com/
) от перезаписи в подкаталог /web
.Следовательно, это привело бы к 403, если бы у вас не было индексного документа каталога (например, index.php
) в корне документа вашего сайта.(Тем не менее, запросы на example.com/page/
должны все еще работать нормально.)
Тестировать с 302 (временными) перенаправлениями и менять только на 301 (постоянные), когда вы уверены, что он работает нормально - чтобы избежать проблем с кэшированием вбраузер.Обязательно очистите кеш браузера перед тестированием.