Не мешает ли Apache RewriteRule директивам If и Location? - PullRequest
0 голосов
/ 17 июня 2020

Я использую Apache для реализации единого входа Shibboleth для сайта Laravel. Я хотел бы обойти одно определенное c подмножество URL-адресов из аутентификации (api/public, например), чтобы они были общедоступными. По какой-то причине файл .htaccess папки publi c, похоже, мешает этому работать должным образом.

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

<Directory /var/www/html/mysite/public>
    SSLOptions +StdEnvVars
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    <If "%{REQUEST_URI} =~ m#api/public#">
        Require all granted
    </If>
    <Else>
        AuthType shibboleth
        ShibRequestSetting requireSession 1
        Require valid-user
    </Else>
</Directory>

Вот файл .htaccess, который Laravel поставляется с:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>


    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

К сожалению, при наличии файла .htaccess код Else все еще выполняется и код Шиба работает. Но я почти уверен, что условие If улавливается, потому что, если ввести Require all denied в качестве теста, то он запретит, как и ожидалось.

Однако, если я удалю .htaccess, это сработает! Но это также означает, что любая маршрутизация внутри Laravel теперь нарушена, что мне действительно нужно для этого URL-адреса publi c.

Я предполагаю, что .htaccess RewriteRule вызывает выполнение кода Else даже после перехвата оператора If. Любые предложения по решению этой проблемы? Возникла та же проблема с использованием директивы Location.

Спасибо.

1 Ответ

0 голосов
/ 19 июня 2020

Придумал решение для этого, поделюсь здесь, если кто-то еще столкнется с этим. Проблема действительно заключалась в том, что RewriteRule заставляет нас снова проходить через все это. If остановил Shibboleth, как и ожидалось в первый раз, но затем мы снова прошли go после того, как Laravel перенаправит нас на index.php и все равно заберет его.

Решил, заменив Else на ElseIf, где мы исключаем index.php:

<Directory /var/www/html/mysite/public>
    SSLOptions +StdEnvVars
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    <If "%{REQUEST_URI} =~ m#api/public#">
        Require all granted
    </If>
    <ElseIf "%{REQUEST_URI} !~ m#index\.php#">
        AuthType shibboleth
        ShibRequestSetting requireSession 1
        Require valid-user
    </ElseIf>
</Directory>
...