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.php
的 ElseIf
来解决它:
<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>
我正在使用 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.php
的 ElseIf
来解决它:
<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>