Я пытаюсь настроить сайт, работающий на Apache 2.4.16, для перенаправления всех URL-адресов www на URL-адреса, отличные от www. Я использую конфигурации Apache для HTML5 Boilerplate для этого (как и все, что они предоставляют).AllowOverride и RewriteCond/RewriteRule взаимодействия
https://github.com/h5bp/server-configs-apache/blob/master/dist/.htaccess
Это происходит на линии 380, показано ниже:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule^%{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>
Я использую Include
добавить весь файл в моем ВХост конфигурации для сайта, а также в качестве AllowOverride All
для другого .htaccess
файл на мой док корень (тот же один, который поставляется с Laravel 5):
production.vhost.conf (соответствующая часть)
<Directory /var/www/hostname/production>
AllowOverride All
# Include H5BP server configs
Include server-configs-apache/dist/.htaccess
</Directory>
.htaccess (в корне док)
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule^index.php [L]
</IfModule>
Теперь почти все из H5BP-х .htaccess
работал, для перенаправления из WWW к не-WWW кроме. После того, как я выкалывал, я заметил, что перенаправление работает только тогда, когда я удаляю AllowOverride All
из блока <Directory>
в vhost. Таким образом, корень doc .htaccess
как-то переопределял условия перезаписи.
Я на самом деле уже сосредоточил свой первоначальный вопрос, перемещая корневой DOC .htaccess
содержимое в файл ВХост и удаление AllowOverride, но мне больше интересно, почему это происходит; более конкретно, как AllowOverride взаимодействует с RewriteCond и RewriteRule.
Моя догадка заключается в том, что .htaccess
в моем корне doc переопределял WWW-перенаправление, но я не уверен, почему именно это. Например, перенаправление http -> https работало без проблем (строка 352 H5BP, без комментирования в моем), казалось, что это просто перенаправление. Я даже не думал, что эти правила могут быть отменены, так как RewriteCond/RewriteRules чувствуют себя уникальными для меня.
Если они есть, то какие правила определяют, как .htaccess
может переопределить правило перезаписи?
My Include предназначен для конфигураций шаблонов html5, это просто так называемый .htaccess. Я могу изменить его имя и получить те же результаты. Извините, если это не ясно. Это мое понимание, что .htaccess фактически переопределяет директивы, когда AllowOverride - это все, поэтому мне было интересно, как это могло быть переписано некоторые из моих правил перезаписи. –
Ок, я вижу. Я бы не назвал это .htaccess. Причина заключается в том, что это имя по умолчанию для [AccessFileName] (https://httpd.apache.org/docs/2.4/howto/htaccess.html#what), и вы, вероятно, создадите проблемы таким образом. И производительность лучше, используя конфигурацию сервера. Измените имя на другое. И он переопределяет директивы для каждого каталога. Так как я упомянул о том, что находится в вашем .htaccess, он будет учитывать настройку. Но ваши текущие правила .htaccess не содержат ничего, что могло бы конфликтовать с перенаправлением на non www. Так что это что-то еще. –
Да, я переключил все на конфигурацию сервера, которая решила мою проблему, мой вопрос был более интересно, почему это происходит в первую очередь. Переадресация начала работать, когда я переместил содержимое .htaccess в корне doc в конфигурацию vhost. Таким образом, мне показалось, что .htaccess у docroot переопределяет некоторые из моих правил перезаписи, которые, как я думал, не были возможны, поскольку они не конфликтуют, как вы упомянули. –