Назад | Перейти на главную страницу

В Apache файл .htaccess переопределяет httpd.conf для mod_rewrites?

В моем апаче httpd.conf файл у меня есть это объявление внутри VirtualHost тег.

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.shanestillwell.com$ [NC]
RewriteRule ^(.*)$ http://www.shanestillwell.com/$1 [L,R=301]

И это внутри моего .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Правило в моем httpd.conf похоже, игнорируется. Правила в .htaccess уничтожение httpd.conf переписать правило?

Обычно ваши настройки в файле .htaccess внутри каталога переопределяют настройки файла httpd.conf. Вы можете отключить этот эффект, отредактировав файл httpd.conf и изменив следующую строку

  <Directory ...> 
  AllowOverride all

к

    <Directory ...> 
    AllowOverride none

Это предотвратит переопределение файла .htaccess настроек httpd.conf. Таким образом, настройки в файле .htaccess не будут иметь никакого эффекта.

В Apache файл .htaccess переопределяет httpd.conf для mod_rewrites?

Буквально ответ - «Нет». Тем не мение, ...

В моем апаче httpd.conf файл у меня есть это объявление внутри VirtualHost тег

Если это действительно так прямо внутри <VirtualHost> контейнер, т.е. в виртуальный хост контексте, тогда эти директивы mod_rewrite должны переопределить директивы mod_rewrite в вашем .htaccess файл - не наоборот. Это поведение нельзя изменить (например, изменив наследование mod_rewrite с помощью RewriteOptions директива).

Однако, если эти директивы находятся внутри <Directory> контейнер (который находится внутри вашего <VirtualHost> контейнер), т.е. в каталог контекст (в отличие от виртуальный хост context, как было предложено выше), затем директивы mod_rewrite в вашем .htaccess файл действительно полностью переопределит директивы mod_rewrite в вашем <Directory> контейнер. Однако это поведение жестяная банка можно изменить, изменив способ наследования директив mod_rewrite. (При любой настройке RewriteOptions InheritBefore в .htaccess файл или RewriteOptions InheritDownBefore в родительском <Directory> контейнер. InheritDownBefore требуется Apache 2.4.8. Однако есть и другие предостережения относительно наследования mod_rewrite, о которых следует знать.)

Ссылка:
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriteoptions

Наблюдаемое вами поведение (и конкретный синтаксис используемой директивы (см. Ниже) - хотя это может быть просто ошибкой, если код никогда не выполнялся?) Предполагает, что эти директивы находятся в каталог контекст, а не виртуальный хост контекст. Итак, да, директивы mod_rewrite в .htaccess полностью переопределит родительские директивы - директивы mod_rewrite в <Directory> контейнер фактически игнорируются.


В стороне:

RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

Если бы это использовалось в виртуальный хост context, то вы получите ошибочную двойную косую черту в начале URL-пути, потому что в виртуальный хост контекст RewriteRule шаблон совпадает с полным URL-путем (с префиксом косой черты). Так что $1 Сама обратная ссылка уже будет содержать префикс косой черты до включения дополнительной косой черты в замена.

Однако в каталог контекст, RewriteRule шаблон совпадает с частичным путем - путь файловой системы за вычетом префикса каталога (который заканчивается косой чертой) - поэтому путь, который соответствует RewriteRule шаблон никогда не начинается с косой черты в каталог контекст (поэтому вам нужно включить его в замена - как и вы).

если у тебя есть <Directory ...> с участием AllowOverride all тогда все, что у вас есть в вашем файле .htaccess, заменит любое предыдущее правило.

Это могло быть в твоем httpd.conf или на вашем virtualhost пока он указывает на / или на путь к вашему домену.