如何在htaccess中使用与AuthUserFile的RELATIVE路径?

时间:2011-05-24 14:02:13

标签: .htaccess .htpasswd

我有一个使用基本身份验证的.htaccess。似乎.htpasswd文件的路径与htaccess文件无关,而是与服务器配置相关。

即使我在同一目录中有.htaccess和.htpasswd文件,但这不起作用:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

但是,如果我将AuthUserFile更改为使用绝对路径,它确实有效:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

但我更喜欢移动设备,因为我在不同区域的多个网站上使用它。我在网上搜索过但没有任何解决方案。是否可以使用相对路径或%{DOCUMENT_ROOT}之类的变量?

9 个答案:

答案 0 :(得分:39)

无法使用AuthUserFile的相对路径:

  

文件路径是用户文件的路径。如果它不是绝对的(即,如果它不是以斜杠开头),则将其视为相对于ServerRoot

你必须接受并解决这个限制。


我们正在使用IfDefine和apache2 command line parameter

.htaccess(适用于开发和实时系统):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

开发服务器配置(Debian)

将以下内容附加到/etc/apache2/envvars

export APACHE_ARGUMENTS=-Ddevelopment

之后重新启动您的apache,只有当您不在开发服务器上时才会收到密码提示。

您当然可以为开发服务器添加另一个IfDefine,只需复制该块并删除!

答案 1 :(得分:12)

1)请注意,在服务器根目录下面放置.htpasswd文件被认为是不安全的。

2)docs对相对路径说这个,所以看起来你运气不好:

  

文件路径是用户文件的路径。如果它不是绝对的(即,如果它不是以斜杠开头),则将其视为相对于ServerRoot

3)虽然建议使用环境变量的答案非常合适,但我更愿意在.htaccess文件中放置占位符,或者在我的代码库中使用不同的版本,并让部署过程将其设置为全部up(即替换占位符或重命名/移动相应的文件)。

在Java项目中,我使用Maven来完成这类工作,比如PHP项目,我喜欢使用build.sh和/或install.sh shell脚本来将已部署的文件调整到他们的环境中。这将您的代码库与其目标环境的细节(即其环境变量和配置参数)分离。一般来说,应用程序应该适应环境,如果你反过来这样做,一旦环境也必须满足不同的应用程序,或者完全不相关的系统特定需求,你可能会遇到问题。

答案 2 :(得分:12)

以防人们为此寻找解决方案:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>

答案 3 :(得分:8)

您可以将Auth设置放入环境中。像:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

Auth正在运行,但我无法让我的环境真正运行。

答案 4 :(得分:4)

.htpasswd需要来自绝对根的完整绝对路径 服务器。

请通过echo echo $_SERVER['DOCUMENT_ROOT'];获取文件的完整绝对路径。

这里是基本的auth .htaccess脚本。

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

登录前

enter image description here

Afetr登录

enter image description here

答案 5 :(得分:3)

如果您正在尝试在Windows上使用XAMPP并希望在实时服务器上使用.htaccess文件,并且在XAMPP开发机器上进行开发,那么以下工作非常有用!


1)全新安装XAMPP后,确保将Apache作为服务安装。

  
      
  • 这是通过打开XAMPP控制面板并单击Apache模块左侧的小红色“X”来完成的。
  •   
  • 然后会询问您是否要将Apache安装为服务。
  •   
  • 然后它应该变成绿色复选标记。
  •   

2)当Apache作为服务安装时,添加一个新的环境变量作为标志。

  
      
  • 首先从XAMPP控制面板停止Apache服务。
  •   
  • 接下来打开命令提示符。 (你知道模拟DOS的小黑窗口)
  •   
  • 键入“C:\ Program Files(x86)\ xampp \ apache \ bin \ httpd.exe”-D“DEV”-k config
  •   
  • 这会将一个新的 DEV 标志添加到您稍后可以使用的环境变量中。
  •   

3)启动Apache

  
      
  • 打开XAMPP控制面板并启动Apache服务。
  •   

4)使用以下信息创建.htaccess文件...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

为了解释上面的脚本,这里有一些注释......

  
      
  • 我的AuthUserFile基于我的设置和个人偏好。
  •   
  • 我有一个本地测试开发框,其网页位于 c:\ sandbox \ web \ 。在该文件夹中,我有一个名为脚本的文件夹,其中包含密码文件 .htpasswd
  •   
  • 第一个条目 IfDefine DEV 用于该实例。如果设置了DEV(这是我们上面所做的,仅在粗机器上),那么它将使用该条目。
  •   
  • 反过来,如果使用实时服务器 IfDefine!DEV 将被使用。
  •   

5)使用以下信息创建您的密码文件(在本例中名为.htpasswd)...

  

用户:$ $ APR1 $ EPuSBcwO / KtqDUttQMNUa5lGXSOzk

需要注意的一些事项......

  

答案 6 :(得分:2)

或者如果你在localhost上开发(仅适用于apache 2.4 +):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>

答案 7 :(得分:1)

让我们举个例子。

您的应用程序位于某些 Linux服务器上的 / var / www / myApp

.htaccess /var/www/myApp/.htaccess

htpasswdApp / var / www / myApp / htpasswdApp 。 (您可以自由使用 .htpasswd 文件的任何名称)

.htaccess 中使用相对路径:

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

但它会在 server_root 目录中搜索文件。不在 document_root 中。

在以下情况下,当应用程序位于 / var / www / myApp 时:

document_root / var / www / myApp

server_root / etc / apache2 //(仅在我们的示例中,因为我们使用 linux服务器

您可以在apache配置文件( /etc/apache2/apache2.conf )中重新定义它,但我认为这是一个坏主意。

因此,要在 /var/www/myApp/.htaccess 中使用相对文件路径,您应该在 server_root 中定义密码文件。

我更喜欢按照以下命令执行:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

您可以自由复制我的命令,使用硬链接而不是符号,或将文件复制到 server_root

答案 8 :(得分:0)

我知道这是一个老问题,但我只是搜索同样的事情,可能还有很多其他人正在寻找快速的移动解决方案。以下是我最终提出的建议:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>