我有一个使用基本身份验证的.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}
之类的变量?
答案 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>
将以下内容附加到/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
登录前
Afetr登录
答案 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
需要注意的一些事项......
- 您的密码文件可以是您想要的任何名称。
- 你应该使用.htpasswd来保证安全。
- 找到了一个很棒的密码生成器@ http://www.htaccesstools.com/htpasswd-generator/
- 您应该将该名称用于文件的一个很好的解释和原因位于@ http://www.htaccesstools.com/articles/htpasswd/
- 请确保您将密码文件放在正确的位置!!! (参见步骤4 AuthUserFile区域)
答案 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>