如何在 htaccess 中使用带有 AuthUserFile 的相对路径?
Posted
技术标签:
【中文标题】如何在 htaccess 中使用带有 AuthUserFile 的相对路径?【英文标题】:How to use a RELATIVE path with AuthUserFile in htaccess? 【发布时间】:2011-08-31 23:35:06 【问题描述】:我有一个使用基本身份验证的 .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
?
【问题讨论】:
【参考方案1】:您可以将身份验证设置放入环境中。喜欢:
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>
身份验证正在运行,但我无法让我的环境真正运行。
【讨论】:
我认为问题在于:“只有早期 SetEnvIf[NoCase] 指令定义的那些环境变量才能以这种方式进行测试。'早期'意味着它们是在更广泛的范围内定义的(例如作为服务器范围)或以前在当前指令的范围内。” (在此处找到:askapache.com/htaccess/setenvif.html)由于您具有相同的范围,您无法让您的环境运行。 为什么这不起作用在这里解释得非常好***.com/questions/11073752/… 但这仍然使用绝对路径(/Users/...
)——问题是:“如何使用相对路径”?
是的。但是您可以使用多个 APPLICATION_ENV 设置,以便在每个环境中使用多个绝对路径。【参考方案2】:
AuthUserFile 不能使用相对路径:
File-path 是用户文件的路径。如果它不是绝对的(即,如果它不以斜杠开头),则将其视为相对于
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,只需复制块并删除 !
。
【讨论】:
但这仍然使用绝对路径(/var/...
)——问题是:“如何使用相对路径”?
然后问题被编辑为正确回答“否”:)【参考方案3】:
1) 请注意,将.htpasswd
文件放在服务器根目录下被认为是不安全的。
2) docs 说这个关于相对路径,所以看起来你不走运:
File-path 是用户文件的路径。如果它不是绝对的(即,如果它不以斜杠开头),则将其视为相对于ServerRoot。
3) 虽然建议使用环境变量的答案工作得很好,但我更愿意在 .htaccess
文件中放置一个占位符,或者在我的代码库中有不同的版本,并让部署过程全部设置好(即替换占位符或重命名/移动相应的文件)。
在 Java 项目中,我使用 Maven 来完成这种类型的工作,比如在 php 项目中,我喜欢使用 build.sh 和/或 install.sh shell 脚本来调整部署的文件以适应他们的环境。这将您的代码库与其目标环境的细节(即其环境变量和配置参数)分离。一般来说,应用程序应该适应环境,如果你反过来做,一旦环境还必须满足不同的应用程序,或者完全不相关的系统特定要求,你可能会遇到问题。
【讨论】:
【参考方案4】:如果您尝试在 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\。在该文件夹中,我有一个名为 scripts 的文件夹,其中包含密码文件 .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 区域)
【讨论】:
但这仍然使用绝对路径(/home...
)——问题是:“如何使用相对路径”?
在 Apache 2.4 ... 除了在命令行上使用 -D
参数定义 DEV
变量,您还可以在服务器配置中使用 Define DEV
指令。【参考方案5】:
.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
登录前
登录后
【讨论】:
【参考方案6】:我知道这是一个老问题,但我只是搜索了同样的东西,可能还有很多其他人在寻找快速的移动解决方案。这是我最终想出的:
# 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>
【讨论】:
但这仍然使用绝对路径(/var...
)-问题问:“如何使用相对路径”?
是的,这是一种变通方法,因为 Apache 不支持指向 .htaccess
文件位置的相对路径。如果您要使用相对路径,它将被视为相对于 ServerRoot
。
这个例子不工作/不完整。如本例所示,<IfDefine>
指令不检查环境变量(由SetEnv
或SetEnvIf
设置)。 <IfDefine>
指令检查已在 Apache 命令行上使用 -D
参数或由服务器配置中的 Define
指令 (Apache 2.4) 定义的 Apache 变量/参数。【参考方案7】:
举个例子吧。
您的应用程序位于某些 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。
【讨论】:
由于 apache 默认会阻止访问以 .ht* 开头的文件,因此不建议为它们使用随机名称。【参考方案8】:或者如果你在 localhost 上开发(仅适用于 apache 2.4+):
<If "%REMOTE_ADDR != '127.0.0.1'">
</If>
【讨论】:
【参考方案9】:以防万一人们正在为此寻找解决方案:
<If "req('Host') = 'www.example.com'">
Authtype Basic
AuthName "user and password"
AuthUserFile /var/www/www.example.com/.htpasswd
Require valid-user
</If>
【讨论】:
这很好,但是依赖req('Host')
是否安全,客户端不能欺骗这个值吗?
@MarcoDemaio 是的,它可以/可以通过使用例如 IP 地址来欺骗。这取决于您的配置。这不是绝对的是或否。这取决于。以上是关于如何在 htaccess 中使用带有 AuthUserFile 的相对路径?的主要内容,如果未能解决你的问题,请参考以下文章
使用 htaccess 添加带有 https 支持的 www
带有 .htaccess 的 timthumb.php 友好 URL
apache htaccess 在带有 cpanel/whm 的子目录中