2016-01-06 2 views
2

Я пытаюсь настроить сайт, работающий на 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 может переопределить правило перезаписи?

ответ

0

Если они есть, то какие правила определяют, как .htaccess может переопределить правило перезаписи?

Условия и положения не определяют, как работает .htaccess. AllowOverride - это то, что позволяет использовать .htaccess. Если у вас есть AllowOverride All, то .htaccess разрешен, если у вас есть AllowOverride None, тогда это не так, и он будет проигнорирован. В 2.4 None по умолчанию.

.htaccess - это каталог, поэтому он будет иметь приоритет, если он находится в каталоге, который применяет правила, если допускается использование файла .htaccess. Конфигурируется в конфигурации сервера в директивах VirtualHost или Directory.

Также использование include для .htaccess в vhost - очень плохая конфигурация.Если у вас есть доступ к файлу vhost или config, вы должны создать другую конфигурацию и включить ее с содержимым .htaccess.

Вы не должны использовать файлы .htaccess at all с доступом к конфигурации сервера. См. Эту рекомендацию apache в отношении использования .htaccess. https://httpd.apache.org/docs/2.4/howto/htaccess.html#when

+0

My Include предназначен для конфигураций шаблонов html5, это просто так называемый .htaccess. Я могу изменить его имя и получить те же результаты. Извините, если это не ясно. Это мое понимание, что .htaccess фактически переопределяет директивы, когда AllowOverride - это все, поэтому мне было интересно, как это могло быть переписано некоторые из моих правил перезаписи. –

+0

Ок, я вижу. Я бы не назвал это .htaccess. Причина заключается в том, что это имя по умолчанию для [AccessFileName] (https://httpd.apache.org/docs/2.4/howto/htaccess.html#what), и вы, вероятно, создадите проблемы таким образом. И производительность лучше, используя конфигурацию сервера. Измените имя на другое. И он переопределяет директивы для каждого каталога. Так как я упомянул о том, что находится в вашем .htaccess, он будет учитывать настройку. Но ваши текущие правила .htaccess не содержат ничего, что могло бы конфликтовать с перенаправлением на non www. Так что это что-то еще. –

+0

Да, я переключил все на конфигурацию сервера, которая решила мою проблему, мой вопрос был более интересно, почему это происходит в первую очередь. Переадресация начала работать, когда я переместил содержимое .htaccess в корне doc в конфигурацию vhost. Таким образом, мне показалось, что .htaccess у docroot переопределяет некоторые из моих правил перезаписи, которые, как я думал, не были возможны, поскольку они не конфликтуют, как вы упомянули. –

Смежные вопросы