需要一个聪明的解决方案来动态生成.htaccess文件



以下是我需要做的操作--任一

  1. 在驻留在服务器B上的.htaccess文件中包含一个外部文件,或者
  2. 使用PHP解析服务器A上的.htaccess文件,或者
  3. 甚至还有一个更聪明的解决方案(鉴于我在httpd.conf和apache指令方面的经验有限,目前我还无法想出)

背景

我在服务器A上有一个.htaccess文件。我将其权限设置为-rw-rw-rw(0666),并根据服务器B上全天的事件动态构建它,以实现我在服务器A.上的应用程序的某些目标。此后,我发现我的托管提供商每晚都会扫描他们的服务器(服务器A),删除世界可写文件文件,并将其权限更改为0664。工藤感谢他们保护服务器。[请不要评论我想要使.htaccess文件世界可写的方法——我真的理解其中的含义]

服务器A上的.htaccess文件只是为了提供Shibboleth身份验证而存在的。我之所以这么说,是因为apache指令的唯一动态方面是Require user堆栈。

是否可以将驻留在服务器B上的"用户堆栈"包含在驻留在服务器A上的.htaccess文件中?

或者我可以通过PHP引擎解析服务器A上的.htaccess文件吗?

谢谢你帮我解决这个问题。

以下是.htaccess的样子:

AuthType shibboleth
AuthName "Secure Login"
ShibRequireSession on
Header append Cache-Control "private"
Require user bob jill steve

每次我在应用程序中添加/更改/删除用户时,我只想更新文件的bob jill steve列表部分,以使我的Shibboleth所需用户(在服务器A上)与我的MySQL/PHP web应用程序(在服务器B上)同步。

(这篇文章的第二版在第一次阅读时错过了Require user点——对不起)。

我的第一直觉和第二直觉是,动态.htaccess文件(特别是设计用于从单独的web服务编写的文件)在安全方面是一场等待发生的灾难,您的托管提供商这样做是正确的,所以您应该将此视为一种约束。

然而,在重写.htaccess文件的应用程序UID(如果模式664,则为GID)内,没有任何东西可以停止服务器a上的进程。为什么不向a添加一个脚本;htaccess";更新请求。这可以接受更新后的Require user数据集作为(例如JSON封装的)参数,加上某种形式的共享秘密签名。此脚本可以包括任何必要的验证并在本地更新htaccess文件。然后,服务器B可以建立该列表并通过网络请求发起该传输。

DOT博士回复后的明信片

我的第一个评论是,我真的很惊讶您的ISP将您的脚本作为nobody运行。我假设所有帐户都是相同处理的,因此不存在由单独帐户创建的文件的UID/GID访问控制分离——在共享环境中这是一个很大的禁忌。通常在suEXEC/suPHP实现中,任何交互式脚本都是在脚本文件的UID中运行的——在您的情况下,我假设您的ftp帐户是匿名的myftpuser。我所能假设的是,您的ISP正在使用mod_php5运行共享帐户,apache以nobody运行,这是非常不寻常的,IMHO。

然而,我为一名医生运行了一个通用信息wiki,它也是这样设置的,我所做的是将所有应用程序的可写内容都放在www-data拥有的目录中(在我的情况下)。毫无疑问,没有什么可以阻止你设置这样一个目录,其中有自己的.htaccess文件——所有这些文件都不为任何人所有,因此可以由脚本更新。

如果您想要一个此类脚本的简单示例,请参阅我的文章在Webfusion共享服务上运行远程命令。

以下是我几天前解决这个问题的方法。

考虑到我的HSP每天晚上都会扫描服务器,并将任何世界可写文件更改为664,我考虑了一种不同的方法。

我做到了:

  1. 白天,我将包含不可写.htaccess文件的目录设置为0777
  2. 然后我删除了.htaccess文件
  3. 然后我重新运行了我的脚本——我的fopen()命令使用模式"w"(所以我想……如果这个文件现在不存在,为什么不让我的php脚本创建它呢?)
  4. 因为我在上面的某个地方说过,我的php以"nobody"的身份运行——瞧!!!!我现在有一个目录中无人拥有的文件

那天晚上晚些时候,我的HSP扫描了服务器,将我的目录从"世界可写"更改为"可写",但没什么大不了的。。。我的.htaccess文件被"nobody"所有,我可以自动更新Require用户指令。

感谢大家在这方面的帮助。

最新更新