Я только что провел около 4 часов в этой проблеме, и я считаю, что у меня есть окончательный ответ, и я могу подвести итог для всех, как решить эту особенно болезненную проблему.
Я использую Windows 7 Home Premium с Apache 2.2x и Php 5.3 в качестве машины для разработки. Я тоже хочу иметь переменную среды DEV, которую я могу использовать в своих файлах .htaccess для отключения перезаписи и других директив, которые недействительны в моей среде разработки, но имеют решающее значение для моей производственной среды.
Мой файл .htaccess выглядит так:
<IfDefine !__DEV__>
AddType application/x-httpd-php53 .php
</IfDefine>
HostGator сообщил мне, что для того, чтобы иметь php 5.3, мне нужно изменить мой файл htaccess таким образом, чтобы включить его, иначе у меня будет только php 5.2. Но у меня уже есть это на моей машине разработки, поэтому эта директива вызывала сбой моего клиентского веб-сайта, когда я просматривал его локально. Все, что я собираюсь объяснить, позволило мне сохранить ОДИН файл .htaccess в моем репозитории Git, который работает в обоих местах.
Во-первых, позвольте мне прояснить/обобщить все, что я узнал, просматривая Интернет в поисках способа использования IfDefine и SetEnv для решения этой проблемы;
- Директива IfDefine в Apache, Only, ONLY, и когда я говорю только, я имею в виду ONLY, отвечает на параметры, переданные в командной строке. Позвольте мне немного подчеркнуть это. ТОЛЬКО КОМАНДНАЯ СТРОКА!
- SetEnv и SetEnvIf — две совершенно разные вещи. Один (SetEnv) предназначен для использования в файлах conf, устанавливая переменные среды (специфичные для apache), которые устанавливаются во ВРЕМЯ ЗАПУСКА СЕРВЕРА. SetEnfIf используется во ВРЕМЯ ЗАПРОСА и используется только для определения того, что нужно установить на основе переменных ЗАПРОСА.
- Директива IfDefine не считывает переменные, заданные SetEnv или SetEnvIf. Период. Нет аргументов, нет вопросов, нет "но я думал..." НЕТ. Это не так, так что смирись с этим.
Короткий ответ: НЕТ, вы не можете просто использовать «SetEnv DEV 1» в httpd.conf, а затем использовать IfDefine, чтобы обнаружить его в вашем файле .htaccess, что может показаться интуитивно понятным и разумным, исходя из синтаксиса и характера логики программирования. из нас привыкли. Напомним, что на самом деле мы ничего не программируем, что это конфигурационные файлы и, конечно, они не соответствуют этому ожиданию просто потому, что им кажется, что они должны.
Ответ
Так что это означает, что я должен выяснить, как добавить параметр запуска в Apache, что ж, для Linux Guys этот ответ легко доступен, вам просто нужно добавить нужные вещи в файл envvars, а как насчет нас, бедных Windows наркоманов?
Что ж, пользователям Windows это доставляет больше удовольствия по следующим причинам:
- Windows не позволяет постоянно добавлять параметры запуска в конфигурацию служб для Apache2.2 (это не работает, не пытайтесь, я делал это миллион раз, поверьте мне). Это правда, если вы зайдете туда и попытаетесь ввести свои собственные параметры, это сработает только один раз, а затем поле параметра будет пустым при следующем открытии диалогового окна. Я не знаю, почему это так, но кажется, что эти параметры предназначены для тестирования, а не для постоянной модификации.
- Когда Apache установлен, он создает ярлыки «Пуск», «Остановить» и «Перезапустить» в меню «Пуск», а также устанавливает монитор служб Apache. НО ярлыки в меню «Пуск» используют параметры запуска, отличные от тех, которые используются монитором служб apache. Таким образом, если вы запускаете/останавливаете apache, используя комбинацию этих методов, вы получите разные результаты в зависимости от того, какой метод вы использовали. Однако вы можете поместить -D "__DEV__" в ярлык меню "Пуск", и он будет работать!
Шаги по решению
Чтобы навсегда и универсально настроить переменную среды __DEV__, на которую вы можете ссылаться, используя IfDefine в файлах .htaccess, в среде разработки Windows, которая будет работать независимо от того, запускаете ли вы Apache с помощью службы или ярлыков в меню «Пуск» или с помощью NET START/STOP на командную строку, выполните следующие действия:
Откройте свойства ярлыка меню «Пуск» и извлеките из него команду для запуска Apache. Мой был; "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -w -n "Apache2.2" -k start
Измените его, чтобы включить новую переменную -D __DEV__, которая ДОЛЖНА идти в начале сразу после httpd.exe; "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -D "__DEV__" -w -n "Apache2.2" -k start
Ваш ярлык в меню «Пуск» теперь запустит apache с вашей переменной dev.
Зайти в командную строку (от имени администратора)
Введите: net stop apache2.2 (или любое другое имя вашей службы для apache)
Теперь введите (или скопируйте и вставьте) ту же команду, которая используется в ярлыке меню «Пуск» выше, в командную строку, но внесите в нее следующее изменение; "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -D "__DEV__" -w -n "Apache2.2" -k config
- Обратите внимание на изменение слова start на config. Что делает эта волшебная команда, так это сохраняет настройки, которые вы видите на экране, в настройки, хранящиеся в службе в Windows. Нажмите Enter. С этого момента ваша переменная будет передаваться всякий раз, когда вы запускаете службу, Apache Services Monitor запускает службу или Windows запускает службу.
Извините за роман всем, я надеюсь, что это поможет какой-то другой усталой душе, когда вся эта информация будет обобщена и объяснена, я знаю, что это помогло бы мне! :D
person
Nerivon
schedule
07.09.2012