当它被重写为index.php时,如何将SetEnvIf与Request_URI一起使用?

时间:2018-02-20 14:48:31

标签: apache .htaccess setenvif

我们有一个受密码保护的drupal网站 private ICommand _showCommand; public ICommand ShowCommand => _showCommand ?? (_showCommand = new Command(ButtonClickAction)); public void ButtonClickAction(object parameter) { //Your action } 。但是,我希望所有a.com URI都不是。所以我读过a.com/api/...

SetEnvIf

虽然AuthName "Stage" AuthType Basic AuthUserFile ~/.htpasswd SetEnvIf Request_URI ".*data_sheets.*\.pdf" noauth SetEnvIf Request_URI "/api/.+" noauth SetEnvIfNoCase Request_Method OPTIONS noauth Order Deny,Allow Deny from all Require valid-user Allow from env=noauth Satisfy Any URI仍然要求输入密码。由于它是一个Drupal网站,在anubhava的帮助下,我们认为它与index.php处理请求的方式有关。

如何处理?

修改

添加

/api/foobar

之后

RewriteCond %{REQUEST_URI} ^/api/ [NC]
RewriteRule ^ - [E=noauth]

没有帮助

3 个答案:

答案 0 :(得分:2)

我迟到了两年,但我已经thorough explanation弄清了正在进行的事情以及如何解决它。简短版本:

RewriteRule由子请求实现。 SetEnvIf模块不会在子请求中继承REQUEST_URI变量。您的noauth变量最终在这些子请求中未定义。

<Location><LocationMatch>块与mod_core的SetEnv一起使用,而不是依赖于mod_setenvif。

答案 1 :(得分:1)

这对我有用:

i

答案 2 :(得分:1)

出于某种原因,我在 3 年后访问了这个问题,并试图发布一个适用于任何 Apache 版本的可行解决方案。

您可以在站点根目录 .htaccess 中使用 Drupal 规则尝试这些规则:

DirectoryIndex index.php
RewriteEngine on

# remove /index.php from URLs
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteCond %{REQUEST_URI} ^(.*/)index\.php$ [NC]
RewriteRule ^ %1 [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

# allow anything that starts with /api/
SetEnvIfNoCase Request_URI ^/api/ noauth

<FilesMatch "^(?!index\.php$).*$">
   AuthType Basic
   AuthName "Stage"
   AuthUserFile ~/.htpasswd
   Require valid-user
   Order   Deny,Allow
   Deny from  all
   Allow from env=noauth
   Satisfy any
</FilesMatch>