如何在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来确保安全。
- 一个伟大的密码生成器发现@ http://www.htaccesstools.com/htpasswd-generator/
- 一个很好的解释和理由,你应该使用该名称为您的文件位于@ http://www.htaccesstools.com/articles/htpasswd/
- 请确保您将密码文件放在正确的位置! (请参阅步骤4 AuthUserFile区域)
.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 。