Могу ли я сделать if/then/else в htaccess?

У меня есть сайт, который обслуживает определенный контент на основе субдомена. Таким образом, это один и тот же набор файлов, и, возможно, заголовок и некоторая информация на страницах сайта меняются в зависимости от поддомена.

Мне также нужна другая аутентификация htpassword на основе поддомена, но я не могу найти информацию о том, как сделать что-то типа if/then в htaccess .

В основном мне нужно это:

если поддомен = 'abc', используйте этот файл htpassword

если subdomain = 'def' используйте этот файл htpassword

Можно ли это сделать?


person user151257    schedule 05.08.2009    source источник


Ответы (5)


Попробуйте что-то вроде этого:

SetEnvIf Host ^abc\. HOST_ABC
SetEnvIf Host ^dev\. HOST_DEF

<IfDefine HOST_ABC>
    AuthUserFile …
</IfDefine>
<IfDefine HOST_DEF>
    AuthUserFile …
</IfDefine>
person Gumbo    schedule 06.08.2009
comment
Это выглядит великолепно — мне пришлось просто создать простую аутентификацию на PHP из-за нехватки времени, но я хотел бы попробовать это в тестовой среде, поскольку это кажется логичным. Спасибо! - person user151257; 07.08.2009
comment
как очаровательно это выглядит, это не сработало для меня. ты бы пересмотрел этот Гамбо? - person Devrim; 15.12.2009

какой веб-сервер вы используете?

техника, которая может работать на нескольких разных серверах (она определенно работает в apache), состоит в том, чтобы иметь разные файлы .htaccess в каталоге, соответствующем каждому поддомену.

person frankster    schedule 05.08.2009
comment
Согласно опубликованному вопросу, это один и тот же набор файлов, поэтому отдельных каталогов нет. - person Amber; 05.08.2009
comment
Это сервер Win 2003, использующий IIS с IISpassword и ISAPIrewrite3. Ваше решение не будет работать, потому что в файловой системе для поддоменов нет физически разных наборов файлов - все поддомены указывают на один и тот же набор файлов, и PHP оценивает поддомен и показывает разные данные на основе этого. Спасибо.. - person user151257; 05.08.2009

Если бы это был я (а я не думал об этом раньше), я бы:

  1. Используйте внутреннюю переадресацию с помощью mod_rewrite на разные корни сайта (/suba или /subb) в зависимости от некоторых факторов (эмулируя IF/ELSE)
  2. Используйте символические ссылки в общедоступном каталоге, но не в .htaccess.

so:

/sites/subdomain_a/.htaccess
/sites/subdomain_a/pub
/sites/subdomain_b/.htaccess
/sites/subdomain_b/pub

куда

/sites/subdomain_a/pub == /sites/subdomain_b/pub

с использованием

ln -s

или похожие. Затем используйте mod_rewrite для перенаправления (внутреннего) в правильный корень сайта. Я думаю, что mod_rewrite запускается до загрузки .htaccess.

Это означает, что вы фактически обслуживаете одни и те же файлы сайта с другим .htaccess в зависимости от субдомена.

Надеюсь, это поможет, немного взломать.

Было бы интересно посмотреть, есть ли что-то лучше.

person Aiden Bell    schedule 05.08.2009

Вы не можете использовать if/else, потому что htaccess не является списком инструкций. Но если вы используете условный блок, такой как ‹IfModule mod_rewrite.c› или ‹IfDefine something›, вы можете использовать разные директивы в зависимости от того, какой субдомен запрашивается. Я не уверен, какой из них вы бы использовали, хотя...

Вы также можете поместить один файл .htaccess на один уровень выше файлов и использовать ‹Directory something›, чтобы указать разные правила для каждого поддомена, но сделать все каталоги поддоменов символическими ссылками на один и тот же каталог с общими файлами.

таким образом, это будет каталог над корневыми веб-сайтами:
.htaccess
файлы сайта
субдомен1 (символическая ссылка на файлы сайта)
субдомен2 (символическая ссылка на файлы сайта)
...

person rpjohnst    schedule 05.08.2009

Вы можете использовать псевдо еще с восклицательным знаком. См. вторую директиву в примере ниже MemCache vs !MemCache:

<IfDefine MemCache>
   LoadModule mem_cache_module   modules/mod_mem_cache.so
</IfDefine>
<IfDefine !MemCache>
   LoadModule cache_disk_module   modules/mod_cache_disk.so
</IfDefine>

Взято из документации apache: https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine

person Adam Genshaft    schedule 30.12.2019