Apache: базовая аутентификация перед перезаписью

У меня есть Apache во внешнем интерфейсе, который должен перенаправить запрос через RewriteRule.

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

<VirtualHost *:443>
    ServerAdmin xxxxxx
    DocumentRoot /var/www/html/
    ServerName xxxxxxx
    RewriteEngine on
    ErrorLog logs/error.log
    CustomLog logs/access_log common

    <Directory /var/www/html/>
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/conf/tag.pwd
        Require valid-user
        RewriteRule ^/(.*) http://xxxxxx:xxx/$1   [P,L]
    </Directory>
</VirtualHost>

Но это не работает.

Какие-либо предложения?

ОБНОВЛЕНИЕ: я ожидал, что все запросы после аутентификации будут перенаправлены с помощью правила RewriteRule ^/(.*) xxxxxx:xxx/$1 [P,L], но этого не происходит. Apache ищет страницу под /var/www/html


person pyro    schedule 09.04.2010    source источник
comment
Что вы ожидали? Что на самом деле произошло? Что вы сделали, чтобы это произошло? Что еще вы пробовали?   -  person John Mee    schedule 10.04.2010
comment
Я ожидаю, что все запросы после аутентификации будут перенаправлены с помощью правила RewriteRule ^/(.*) xxxxxx:xxx/$1 [P,L], но этого не происходит Apache ищет страницу в /var/www/html   -  person pyro    schedule 10.04.2010


Ответы (4)


Как правило, Apache выполняет фазу перезаписи перед фазой авторизации, поэтому ваш код выполняет перезапись, даже не запрашивая аутентификацию пользователя.

Вы можете обойти это с помощью переменной LA-U:REMOTE_USER. Предварите свое RewriteRule условием, которое смотрит вперед («LA») на фазу авторизации:

RewriteCond %{LA-U:REMOTE_USER} !^$
RewriteRule ^/(.*) http://xxxxxx:xxx/$1 [L]

См. примечания об этом в http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

Как отмечают другие авторы, также лучше вынести директивы RewriteRule из блока, чтобы они были более надежными.

person Travis Wilson    schedule 08.11.2012
comment
Это отвечает на отличную проблему от указанной в вопросе. ваш код выполняет перезапись, даже не запрашивая аутентификацию пользователя. Это не то, что указано в вопросе. В OP указано, что RewriteRule вообще не обрабатывается - пользователю предлагается пройти аутентификацию. В коде в OP отсутствует директива RewriteEngine On внутри контейнера <Directory>, а регулярное выражение неверно (не должно быть префикса косой черты в контексте каталога) - обе эти проблемы не позволят директиве mod_rewrite что-либо делать . См. stackoverflow.com/a/62914796/369434. - person MrWhite; 15.07.2020

Я решил поместить условие перезаписи и правило перезаписи вне директивы Locatio:

<Location />
  AuthType Basic
  AuthName "Restricted Files"
  AuthUserFile /etc/httpd/conf/tag.pwd
  Require valid-user
</Location>
RewriteCond %{LA-U:REMOTE_USER} !^$
RewriteRule ^/(.*) http://xxxxxx:xxx/$1   [P,L]

большое спасибо h0tw1r3 за предложение

* Имейте в виду, что директивы Location работают с URL-адресами, а не с каталогами. Это означает, что если кто-то создаст псевдоним для корня документа, он полностью обойдёт эти правила аутентификации. (См. http://httpd.apache.org/docs/2.0/mod/core.html#location, чтобы узнать больше.)

person pyro    schedule 12.04.2010
comment
обойти эти правила аутентификации. Хотя, как указано в документах, одиночная косая черта (/) является особым случаем, поскольку она применяется к каждому URL-адресу, поэтому ее нельзя обойти в этом отношении. (Конечно, если псевдоним создается из совершенно другого виртуального хоста, то он будет обойден, но в этом случае будет пропущен весь виртуальный хост, а не только блок Location.) - person MrWhite; 15.07.2020

Обновление. Неявное правило каталога гарантирует, что перед перезаписью всегда требуется проверка. Обнаружено, что разные комбинации модулей apache изменили поведение, поэтому принятый ответ может не всегда работать.

<Location />
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /etc/httpd/conf/tag.pwd
    Require valid-user
</Location>

<Directory /documentroot>
    RewriteCond %{LA-U:REMOTE_USER} (.+)
    RewriteRule (.*) http://xxxxxx:xxx/$1   [P,L]
</Directory>
person h0tw1r3    schedule 11.04.2010
comment
ммм, это не работает :(. Apache продолжает искать страницу локально - person pyro; 12.04.2010
comment
Недавно это снова всплыло, даже принятый ответ пиротехники не сработал у меня на Apache 2.2.22 (Ubuntu). - person h0tw1r3; 19.03.2012
comment
Вам необходимо включить механизм перезаписи (т.е. RewriteEngine On) внутри контейнера <Directory>, иначе директивы mod_rewrite будут просто игнорироваться. (Что является одной из проблем в ОП.) См. мой ответ ниже. - person MrWhite; 15.07.2020

<Directory /var/www/html/>
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /etc/httpd/conf/tag.pwd
    Require valid-user
    RewriteRule ^/(.*) http://xxxxxx:xxx/$1   [P,L]
</Directory>

Здесь есть 2 проблемы, которые не позволят вашему RewriteRule что-либо сделать:

  1. Вам необходимо включить механизм перезаписи внутри контейнера <Directory> (контекст каталога). Вы (неправильно) включили механизм перезаписи во внешнем контейнере <VirtualHost> (в контексте virtualhost), в котором у вас нет директив mod_rewrite. Контейнеры <VirtualHost> и <Directory> работают в разных контекстах. Если вы не включите механизм перезаписи внутри контейнера <Directory>, директивы будут просто проигнорированы.

    RewriteEngine On
    
  2. При использовании в контексте каталога (<Directory> и .htaccess) URL-путь, соответствующий шаблону RewriteRule, не начинается с косой черты, поскольку префикс каталога (заканчивающийся на косая черта) был удален. Итак, вам нужно удалить префикс косой черты из регулярного выражения, иначе он просто никогда не будет совпадать в контексте каталога:

    RewriteRule (.*) http://xxxxxx:xxx/$1 [P,L]
    

    (Тогда префикс ^ в шаблоне становится излишним.)

Резюме

Действуя по вышеуказанным пунктам, это становится:

<Directory /var/www/html/>
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /etc/httpd/conf/tag.pwd
    Require valid-user

    RewriteEngine On
    RewriteRule (.*) http://xxxxxx:xxx/$1 [P,L]
</Directory>

В качестве альтернативы вы перемещаете директиву RewriteRule за пределы контейнера <Directory> и используете ее непосредственно внутри контейнера <VirtualHost>, в котором вы уже включили механизм перезаписи.

Однако в этом контексте директивы mod_rewrite будут выполняться перед директивами авторизации внутри контейнера <Directory>, поэтому вам потребуется дополнительное условие, которое проверяет REMOTE_USER с помощью предпросмотра (т.е. LA-U:REMOTE_USER), как упоминается в других ответах.

person MrWhite    schedule 15.07.2020