1

Я пытаюсь исключить путь (URI) от блокировки базовым HTTP-аутентификатором. Путь/rest (http://example.com/rest) и представляет собой контроллер приложения cakephp 3. Это не настоящий файл, а путь, переписанный условием перезаписи и обработанный index.php в каталоге webroot.Исключить конкретный контроллер cakephp из http basic auth

Вот правила перезаписи:

/var/www/.htaccess:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^$ webroot/ [L] 
    RewriteRule (.*) webroot/$1 [L] 
</IfModule> 

/var/www/webroot/.htaccess:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^index.php [L] 
</IfModule> 

Я бегу Apache 2.4 и пытавшихся различные конфигурации:

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot /var/www/webroot 
<Directory /var/www> 
    Options FollowSymLinks 
    AllowOverride All 
</Directory> 
<Location "/"> 
      AuthType Basic 
      AuthName "Keawe Development" 
      AuthUserFile /host/.htpasswd 
      Require valid-user 
      Require expr %{REQUEST_URI} =~ m#/rest/.*# 
      Require expr %{REQUEST_URI} =~ m#/index.php/rest/.*# 
</Location> 
    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 

... адаптировано из https://stackoverflow.com/a/33655232/1285585

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot /var/www/webroot 
<Directory /var/www> 
    Options FollowSymLinks 
    AllowOverride All 
</Directory> 
<Location "/"> 
      AuthType Basic 
      AuthName "Keawe Development" 
      AuthUserFile /host/.htpasswd 
      Require valid-user 
</Location> 
<Location "/rest"> 
    Allow from all 
    Satisfy any 
</Location> 
    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 

... от https://serverfault.com/a/475845/229877

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot /var/www/webroot 
<Directory /var/www> 
    Options FollowSymLinks 
    AllowOverride All 
</Directory> 
<Location "/"> 
    AuthType Basic 
    AuthName "Keawe Development" 
    AuthUserFile /host/.htpasswd 
    Require valid-user 
</Location> 
<Location "/rest"> 
    Require all granted 
</Location> 
    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</Virtualhost> 

... от https://www.apachelounge.com/viewtopic.php?p=30200

... 
<Location "/"> 
      SetEnvIf Request_URI ^/rest noauth=1 
      SetEnvIf Request_URI /rest noauth=1 
      SetEnvIf Request_URI ^/index.php/rest noauth=1 
      SetEnvIf Request_URI /index.php/rest noauth=1 

      AuthType Basic 
      AuthName "Keawe Development" 
      AuthUserFile /host/.htpasswd 
      Order Deny,Allow 
      Satisfy any 
      Deny from all 
      Require valid-user 
      Allow from env=noauth 
</Location> 

... от https://stackoverflow.com/a/8979889/1285585

<Location "/"> 
    AuthType Basic 
    AuthName "Keawe Development" 
    AuthUserFile /host/.htpasswd 
    Require valid-user 
</Location> 
<Location ~ "/(rest|index.php/rest)"> 
    Satisfy Any 
    Allow from all 
    AuthType None 
    Require all granted 
</Location> 

... от https://stackoverflow.com/a/13296294/1285585

<Location "/"> 
    AuthType Basic 
    AuthName "Keawe Development" 
    AuthUserFile /host/.htpasswd 
    Require valid-user 
</Location> 
<Files "index.php/rest"> 
    Satisfy Any 
    Allow from all 
</Files> 
<Files "rest"> 
    Satisfy Any 
    Allow from all 
</Files> 

... от HTTP Basic Auth Exclude Single File

Однако ни один из них не похоже на работу. Я всегда получаю ошибку 401, используя wget или auth-запрос из браузера.

Проблема заключается в том, что путь/отдых передает условие, но затем переписывается в index.php, который находится под управлением базового auth (и должен быть).

Любые подсказки?

ответ

5

Наконец-то выяснилось, когда я наткнулся на этот ответ (https://stackoverflow.com/a/14010456/1285585) на соответствующий вопрос.

Вот мое решение:

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot /var/www/webroot 
    <Directory /var/www> 
    Options FollowSymLinks 
    AllowOverride All 
</Directory> 

<Location "/"> 
    # Default to Basic Auth protection for any stie 
    AuthType Basic 
    AuthName "Keawe Development" 
    AuthUserFile /host/.htpasswd 
    Require valid-user 

    # If the request goes to a rest page: bypass basic auth 
    SetEnvIf Request_URI ^/rest/ noauth=1 
    Allow from env=REDIRECT_noauth 
    Allow from env=noauth 

    Order Deny,Allow 
    Satisfy any 
    Deny from all 
    </Location> 

    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 
+0

Что 'REDIRECT_noauth' означает? – Shoan

+0

Если происходит перенаправление, правило SetEnvIf будет применяться дважды: один раз до и один раз после перенаправления. Будет задана переменная среды noauth, если Request_URI соответствует заданному токену '^/rest /' после перенаправления, тогда как REDIRECT_noaut установлен, если Request_URI соответствует PRIOR для перенаправления. –