SetEnvIf HTTP_HOST не работает - PullRequest
       59

SetEnvIf HTTP_HOST не работает

2 голосов
/ 09 февраля 2012

Я не могу заставить его работать в этой части .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?

Edit: Любой другой способ достигнуть вышеупомянутого?

Ответы [ 3 ]

8 голосов
/ 01 марта 2012

SetEnvIf работает по заголовкам запросов. Итак, вы хотите использовать HOST, а не HTTP_HOST. Э.Г.

SetEnvIf HOST ^localhost$ local
4 голосов
/ 09 февраля 2012

SetEnvIf устанавливает переменную окружения .Он не определяет новую константу для использования Apache.

См. SetEnvIf руководство и сравните его с <IfDefine> manual .

3 голосов
/ 09 февраля 2012

Мой ответ, если этот 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 для этого ..
  • RewriteBase принимает аргумент пути URI, поэтому /app будет работать в обоих случаях.
  • В общем, Apache понимает разницу между доменами URI и FS и не смущается - даже ваши разработчики регулярно это делают :-) В тех редких случаях, когда вам нужно явно ссылаться на имя FS, скажем, в RewriteCond string, вы можете использовать %{DOCUMENT_ROOT} - хотя, если ваш сервис является общим сервисом, вам, возможно, придется использовать переменную окружения (у меня это %{ENV:DOCUMENT_ROOT_REAL}). Я phpinfo () скажу вам, что.
  • Убедитесь, что вы используете относительные адреса в любых RewriteRule заменах (без начальных косых черт).

Итак, подведя итог, немного подумав, вы можете сделать свои конфигурации логически идентичными, как предлагает Apache - разве это не лучше, чем попытка выполнить условное выполнение способом, который никогда не был встроен в продукт?

...