Используйте Require в VirtualHost и .htaccess - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу, чтобы GeoIP проверил в VirtualHost и в случае успеха получил файл .htaccess обрабатываемой веб-страницы, который также имеет некоторые установленные директивы Require (для ее файлов).

Я использую макросы и переменные окружения для динамических c конфигов, поэтому в настоящее время моя конфигурация vhost выглядит следующим образом:

<VirtualHost ${myIP4}:443>
...
<Directory "/srv/www/$domain/htdocs">
    MaxMindDBEnable On
    MaxMindDBFile COUNTRY_DB /var/lib/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
    SetEnvIf MM_COUNTRY_CODE "^$countries" PassCountry

    AllowOverride None
    Require all denied
    Require env PassCountry
</Directory>

Это прекрасно работает, когда доступ к $countries должен быть отменен, так как Require all denied выигрывает. Но когда это правильный код страны, должен быть выполнен файл .htaccess, для которого мне понадобится AllowOverride All.

Я пробовал несколько способов, например

<If "reqenv('PassCountry') == 1">
    AllowOverride All
</If>

, но если Предложение, похоже, не оценивается правильно.

Но это не единственная проблема. Также при добавлении в дерево else (для целей тестирования)

<Else>
    AllowOverride All
</Else>

он не распознается, хотя и говорит, что его можно использовать в предложениях if.

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

см. https://httpd.apache.org/docs/2.4/en/mod/core.html#if

Итак, как я могу решить мою проблему?

1 Ответ

0 голосов
/ 10 апреля 2020

Решил это сейчас, используя mod_rewrite следующим образом:

MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /var/lib/GeoIP/GeoLite2-Country.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
SetEnvIf MM_COUNTRY_CODE "^$countries" PassCountry=1

RewriteEngine on
RewriteCond %{ENV:PassCountry} !1
# allow showing error documents (maybe required to be adopted when not using defaults)
RewriteRule !(^/error/) "-" [F]

Но это не работает внутри директивы <Directory>, поэтому уберите его оттуда.

...