如何在htaccess中使用AuthUserFile的RELATIVEpath?

我有一个使用基本身份validation的.htaccess。 看起来.htpasswd文件的path不是相对于htaccess文件,而是相对于服务器configuration。

所以,即使我在.htaccess和.htpasswd文件在同一目录中,这是行不通的:

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

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

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

但我更喜欢更多的移动,因为我在不同地区的多个网站上使用它。 我在网上search,但没有任何解决scheme。 是否可以使用相对path或像%{DOCUMENT_ROOT}这样的variables?

AuthUserFile不能使用相对path:

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

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


我们使用IfDefine和apache2 命令行参数 :

.htaccess (适用于开发和现场系统):

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

开发服务器configuration(Debian)

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

 export APACHE_ARGUMENTS=-Ddevelopment 

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

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

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

2) 文件说这是关于相对path,所以看起来你运气不好:

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

3)虽然推荐使用环境variables的答案工作得很好,但是我更愿意在.htaccess文件中放置一个占位符,或者在我的代码库中放置不同的版本,并且让部署过程将它全部设置好(即replace占位符或重命名/移动相应的文件)。

在Java项目中,我使用Maven来完成这种types的工作,例如在PHP项目中,我喜欢使用build.sh和/或install.sh shell脚本来将部署的文件调整到其环境中。 这将您的代码库与其目标环境的细节(即其环境variables和configuration参数)分开。 一般情况下,应用程序应该适应环境,反之,如果环境也需要满足不同的应用程序或完全不相关的系统特定需求,则可能会遇到问题。

您可以将您的身份validation设置放入环境中。 喜欢:

 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> 

身份validation正在工作,但我无法让我的环境真正运行。

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


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

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

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

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

3)启动Apache

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

4)使用以下信息创build您的.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是基于我的设置和个人喜好。
  • 我有一个本地testing开发框,其网页位于c:\ sandbox \ web \ 。 在那个文件夹里我有一个名为脚本的文件夹,里面包含密码文件.htpasswd
  • 第一个条目IfDefine DEV用于该实例。 如果设置DEV(这是我们上面所做的,只有在粗糙的开发机器上),那么它将使用该条目。
  • 而如果使用活动服务器IfDefine!DEV将被使用。

5)创build您的密码文件(在这种情况下名为.htpasswd)与以下信息…

用户:$ APR1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk。

几件事要注意…

.htpasswd需要从服务器的绝对根目录获得完整的绝对path。

请通过echo echo $_SERVER['DOCUMENT_ROOT'];获取文件的完整pathecho $_SERVER['DOCUMENT_ROOT'];

这里是基本的身份validation.htaccess脚本。

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

login前

在这里输入图像说明

Afetrlogin

在这里输入图像说明

为了防止人们为此寻找解决scheme:

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

我知道这是一个老问题,但我只是寻找相同的东西,可能还有其他许多人正在寻找一个快速的移动解决scheme。 这是我终于想到的:

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

或者如果你开发本地主机(只适用于Apache 2.4 +):

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

我们来举个例子。

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

.htaccess/var/www/myApp/.htaccess

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

.htaccess中使用相对path:

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

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

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

document_root/ var / www / myApp

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

你可以在你的apacheconfiguration文件( /etc/apache2/apache2.conf )中重新定义它,但我想这是一个坏主意。

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

我更喜欢遵循命令:

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

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