Apache RewriteRule 是否会干扰 If 和 Location 指令?

Is Apache RewriteRule interfering with If and Location directives?

我正在使用 Apache 为 Laravel 站点实施 Shibboleth 单点登录。我想绕过 URL 的一个特定子集进行身份验证(例如 api/public),以便 public 可以访问它们。出于某种原因,public 文件夹的 .htaccess 文件似乎阻止了它按预期工作。

我已经尝试了很多不同的方法,所有的方法都导致了同样的问题。这是我目前正在尝试的。

<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>

这是 Laravel 附带的 .htaccess 文件:

<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 代码仍在执行,Shib 代码 运行s。但我很确定 If 条件正在捕获,因为如果将 Require all denied 作为测试抛出,那么它会按预期禁止。

但是,如果我删除 .htaccess,这就可以了!但这也意味着 Laravel 内的任何路由现在都已损坏,我确实需要这个面向 public 的 URL。

我最好的猜测是 .htaccess RewriteRule 导致 Else 代码仍然 运行 即使在 If 语句被捕获之后。关于解决这个问题的任何建议? 运行 使用 Location 指令遇到同样的问题。

谢谢。

找到解决方案,将在此处分享,以防其他人 运行 参与其中。问题确实是 RewriteRule 导致我们再次 运行 完成整个过程。 If 第一次按预期停止了 Shibboleth,但是在 Laravel 将我们重定向到 index.php 之后我们将再次通过它并无论如何选择它。

通过将 Else 更改为我们排除 index.phpElseIf 来解决它:

<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>