SetEnvIf HTTP_HOST не работает
Я не могу заставить это работать в этой части.htaccess, IfDefine
никогда не бежит. Что я делаю неправильно, setenvif
мод включен.
RewriteBase /
SetEnvIf HTTP_HOST ^localhost$ local
<IfDefine local>
RewriteBase /codeigniter-app/
</IfDefine>
SetEnvIf HTTP_HOST ^testing.alex.com$ testing
<IfDefine testing>
RewriteBase /app/
</IfDefine>
Это основано на: С помощью mod_rewrite я могу указать RewriteBase внутри RewriteCond?
Изменить: Любой другой способ достижения вышеизложенного?
3 ответа
Мой ответ, если этот Apache не позволяет вам делать то, что вы пытаетесь сделать здесь, но это потому, что AFAIK вам не нужно делать это, чтобы делать то, что вам действительно нужно делать.
Кажется, что вы пытаетесь создать локальную среду, которая в терминах конфигурации отражает вашу (удаленную) серверную тестовую среду. Однако вы путаете пространство имен URI и пространство имен файловой системы, и в Apache Server они совершенно разные. Например, <Location>
Директива действует на первом и <Directory>
Директива действует на последнем. .htaccess
как бы разрезать оба, так что вам нужно понять, когда параметр работает с одним или другим.
Например, у меня есть общая учетная запись службы, которая обслуживает несколько поддоменов *.ellisons.org.uk
- например, мой блог находится на http://blog.ellisons.org.uk/. Я разрабатываю на ноутбуке Ubuntu и виртуальной машине, которая отражает конфигурацию LAMP/suPHP, с которой работает мой поставщик услуг (но у меня есть root-доступ и я вижу журналы перезаписи и т. Д. На виртуальной машине). Я статически выделяю IP-адреса в своем 192.168.1.0/24
личное адресное пространство и иметь /etc/hosts
синонимы для
127.0.1.1 ... blog.ellisons.org.home forum.ellisons.org.home ...
192.168.1.250 ... blog.ellisons.org.vm ...
Но кроме этого пространство URI идентично, поэтому blog.ellisons.org.XX/themes/terry/all.css
загружает мои css с моего сервера, ноутбука или виртуальной машины в зависимости от того, где XX=uk,home,vm
Однако документация на моем ноутбуке соответствует стандарту Debian /var/www
, но на двух других это /websites/LinuxPackage02/el/li/so/ellisons.org.uk/public_html
(Соглашение об именовании моих хостеров). Тем не менее мое приложение, включая .htaccess
файлы идентичны, и единственный способ, которым они отражают это многократное использование, в регулярных выражениях, где я использую в качестве регулярного выражения совпадение%{HTTP_HOST} (\w+)\.ellisons.\org\.(?:uk|home|vm)
,
Итак, к вашему примеру:
- Там ничто не мешает вам указывать на запросы
/app
в ваш физический каталог/codeigniter-app
на вашем локальном ПК. Вы можете использоватьAlias
директива на вашем сервере или vhost config, чтобы сделать это.. RewriteBase
принимает аргумент пути URI так/app
будет работать в обоих.- В общем, Apache понимает разницу между доменами URI и FS и не смущается - даже ваши разработчики регулярно это делают:-) В тех редких случаях, когда вам необходимо явно обратиться к имени FS, скажем, в
RewriteCond
Строка, вы можете использовать%{DOCUMENT_ROOT}
- хотя, если ваша служба является общей, вам, возможно, придется использовать переменную среды (моя%{ENV:DOCUMENT_ROOT_REAL}
). Я phpinfo() скажу вам, что. - Убедитесь, что вы используете относительные адреса в любом
RewriteRule
замены (без косых черт).
Подводя итог, немного подумав, вы можете сделать свои конфигурации логически идентичными, как предлагает Apache - разве это не лучше, чем попытка выполнить условное выполнение способом, который никогда не был встроен в продукт?
SetEnvIf работает по запросу заголовков. Итак, вы хотите использовать HOST, а не HTTP_HOST. Например
SetEnvIf HOST ^localhost$ local
SetEnvIf
устанавливает переменную среды Он не определяет новую константу для использования Apache.
Увидеть SetEnvIf
руководство и сравнить его с <IfDefine>
ручной.
Также необходимо убедиться, что .htaccess
файл фактически используется путем добавления следующего для конфигурации вашего виртуального хоста:
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
# Other stuff
</Directory>
В AllowOverride All
директива позволяет переопределить директивы конфигурации из .htaccess
файл для каждого каталога.