Как я могу иметь условный блок .htaccess? - PullRequest
16 голосов
/ 10 апреля 2009

Это вопрос Apache, с которым вы, вероятно, сталкивались раньше. Я хочу иметь один исходный пакет, который я могу развернуть на своей рабочей станции, моем промежуточном сервере и моем производственном сервере, но чтобы он загружал различные параметры .htaccess в зависимости от того, какой URL был.

Обратите внимание, что я использовал kludge с вызовом IfModule, но он не будет работать с нашим новым рабочим сервером, потому что он использует все те же модули, что и мой промежуточный сервер.

Примечание. Мне нужно связать SetEnv с этими изменениями. В настоящее время, если вы используете RewriteCond, он связывается только со следующим RewriteRule, но не с SetEnv внизу.

Ответы [ 4 ]

15 голосов
/ 21 апреля 2009

Вместо использования SetEnv используйте возможности установки переменных среды самого RewriteRule:

RewriteCond %{HTTP_HOST} =foo.com
RewriteRule ^ - [E=VARNAME:foo]

RewriteCond %{HTTP_HOST} =bar.com
RewriteRule ^ - [E=VARNAME:bar]

Хотя я предпочитаю делать такие вещи, передавая флаги процессу httpd при запуске и просматривая их с помощью блоков IfDefine.

<IfDefine FOO>
SetEnv VARNAME foo
</IfDefine>

<IfDefine BAR>
SetEnv VARNAME bar
</IfDefine>
6 голосов
/ 22 ноября 2009

В Ubuntu Linux переменная IfDefine установлена ​​в

/etc/apache2/envvars

и называется APACHE_ARGUMENTS. Итак, внизу этого файла я должен был добавить:

export APACHE_ARGUMENTS="-D dev"

... и затем сбросить сервер с помощью:

/etc/init.d/apache2 stop
/etc/init.d/apache2 start

В других системах:

Тем не менее, есть статья Debian на эту тему, в которой обсуждается здесь . В этом примере файл для редактирования - это / etc / default / apache2, а переменная называется APACHE_DEFINES.

Аналогично, в некоторых системах это переменная с именем OPTIONS, установленная в /etc/sysconfig/httpd.

Итак, что вам действительно нужно сделать, так это найти начальный раздел в вашем файле apache2ctl. Итак, начните с выполнения whereis apache2ctl, чтобы найти, где находится этот скрипт, отследить его, найти раздел start с директивой apache2 и посмотреть, передается ли переменная OPTIONS, APACHE_ARGUMENTS, APACHE_DEFINES , или что-то другое. Затем посмотрите, какой файл нужно отредактировать, экспериментируя с /etc/sysconfig/httpd, /etc/default/apache2 или /etc/apache2/envvars.

.
1 голос
/ 10 апреля 2009

Вот простой пример, который может быть достаточным для его изменения в соответствии с вашими требованиями:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteBase /

    RewriteCond %{HTTP_HOST} !^localhost
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
0 голосов
/ 10 октября 2018

Я попробовал метод IfDefine, но он не сработал, хотя определенная переменная, которую я передал при запуске Apache, определенно отображалась в phpinfo() в строке APACHE_ARGUMENTS.

Я попробовал другой метод, и он работал отлично. В вашем файле .htaccess вам нужно что-то вроде:

# Is the domain local (i wanted to check two names)? <If "%{SERVER_NAME} != 'localhost' && %{SERVER_NAME} != 'myproject.localhost'"> # I wanted to password protect the production server only AuthType Basic AuthName "Restricted area" AuthUserFile /app/.htpasswd require valid-user </If>

Я использую Apache 2.4. Может не работать для более ранних версий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...