RewriteMap с текстовой опцией всегда не возвращает результата

Я собираюсь ответить на этот вопрос самостоятельно, потому что я столкнулся с ним и не смог найти ни одного результата Google, который мог бы помочь, поэтому, надеюсь, это может сэкономить какое-то время кому-то в будущем.

В Apache2.2 у меня есть RewriteMap, созданный таким образом, чтобы перенаправить на URL-адрес, если присутствует конкретный аргумент строки запроса:

RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt"

RewriteCond %{QUERY_STRING} (^|&)foo=([^&]+) [NC]
RewriteCond ${redirect:%1} !^$
RewriteRule ^.*$ ${redirect:%1} [301,L]

И /etc/arbitrary1/arbitrary2/redirect.txt:

foo http://hello.invalid/somepath/1  # 1
bar http://hello.invalid/somepath/2  # 2
baz http://hello.invalid/somepath/3  # 3

Проблема, с которой я столкнулся, заключалась в том, что независимо от того, какой из «foo, bar, baz» я использовал, директива ${redirect:%1} возвращала пустое значение (то есть «нет совпадения»). Это было независимо от формата redirect.txt. СМОТРИТЕ НИЖЕ, ЧТО Я ОБНАРУЖИЛ.


person A. Wilson    schedule 18.05.2017    source источник


Ответы (1)


Таким образом, проблема заключалась в том, что промежуточный каталог /etc/arbitrary1 не имел прав на выполнение для пользователя www-data. Причина, по которой это заняло так много времени, заключалась в том, что, очевидно, suid от root происходит после проверки существования файла. То есть, если бы я изменил RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt" на RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/doesnotexist.txt", Apache выдал бы ошибку при перезапуске, что указывало на то, что у него не было проблем со статусом /etc/arbitrary1/arbitrary2/redirect.txt при загрузке конфигурации. Поскольку Apache обнаружил его при запуске, я предположил, что он также может получить к нему доступ во время выполнения (что оказалось неверным предположением). Когда я дал /etc/arbitrary1 разрешение на выполнение, которое соответствовало www-данным (с chown www-data:www-data /etc/arbitrary1 или chmod o+x /etc/arbitrary1), карта работала нормально.

person A. Wilson    schedule 18.05.2017