htaccess中如何在AuthUserFile中使用相对路径?


98

我有一个使用基本身份验证的.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}

Answers:


51

无法为AuthUserFile使用相对路径:

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

您必须接受并解决该限制。


我们IfDefine与apache2 命令行参数一起使用:

.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,只需复制该块并删除即可!


4
但这仍然使用绝对路径(/var/...)-问题问:“如何使用相对路径”?
sdaau

1
然后将问题编辑为正确回答“否” :)
Erenor Paz

15

以防万一,人们正在寻找解决方案:

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

1
这会很好,但是可以安全地依靠它req('Host'),客户不能欺骗这个价值吗?
Marco Demaio

1
@MarcoDemaio是的,可以/可以通过使用例如IP地址来欺骗它。这取决于您的配置。这不是绝对的是或否。这取决于。
马克西姆

12

1)请注意,拥有 .htpasswd文件放在服务器根目录下。

2)文档说的是相对路径,所以看起来您不走运:

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

3)虽然建议使用环境变量的答案可以很好地工作,但我宁愿将占位符放在 .htaccess文件中,或者在我的代码库中使用不同的版本,并在部署过程中全部设置好(即替换占位符或重命名/移动适当的文件)。

在Java项目上,我使用Maven进行此类工作,例如在PHP项目上,我喜欢使用build.sh和/或install.sh Shell脚本来将已部署的文件调整到其环境。这使您的代码库与目标环境的细节(即,环境变量和配置参数)脱钩。通常,应用程序应该适应环境,否则,一旦环境还必须满足不同的应用程序或完全不相关的特定于系统的要求,您可能会遇到问题。


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>

身份验证正在运行,但是我无法真正运行我的环境。


1
我认为问题是这样的:“只有较早的SetEnvIf [NoCase]指令定义的那些环境变量才能以这种方式进行测试。'较早的'意味着它们是在更广泛的范围(例如服务器范围)或更早的版本中定义的。当前指令的范围。” (可在此处找到:askapache.com/htaccess/setenvif.html)由于具有相同的作用域,因此无法使环境运行。
user470370 2012年

4
这是为什么不工作特别好这里解释stackoverflow.com/questions/11073752/...
尼科gawenda

但这仍然使用绝对路径(/Users/...)-问题问:“如何使用相对路径”?
sdaau

是。但是您可以使用多个APPLICATION_ENV设置,以便在每个环境中使用多个绝对路径。
digitaldonkey

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

登录前

在此处输入图片说明

Afetr登录

在此处输入图片说明


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(这是我们上面所做的,仅在粗糙的dev机器上),则它将使用该条目。
  • 然后,如果使用实时服务器,则将使用IfDefine!DEV

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

用户:$ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk。

注意事项...


但这仍然使用绝对路径(/home...)-问题问:“如何使用相对路径”?
sdaau

2

或者如果您在localhost上开发(仅针对Apache 2.4+):

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

1

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

# 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...)-问题问:“如何使用相对路径”?
sdaau

1
是的,这是一种变通方法,因为Apache不支持.htaccess文件位置的相对路径。如果要使用相对路径,则将其视为相对于ServerRoot
ovi 2015年

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


1
由于默认情况下apache阻止访问以.ht *开头的文件,因此不建议对它们使用随机名称。
卡里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.