Mod_rewrite到特定的基本auth用户子目录

时间:2014-12-14 10:42:38

标签: apache .htaccess mod-rewrite

对于开发环境我在Apache中的DocumentRoot指向/ var / www。该文件夹包含以下结构:

/var/www/username1/projectname/
/var/www/username2/projectname/
/var/www/username3/projectname/

使用.htaccess / .htpasswd,有人需要使用基本身份验证登录。当用户登录时,他/她将被移动到/var/www/[hisorherusername]/[projectname]/。使用这种技术,每个开发人员都应该指向他/她自己的代码,同时仍然使用相同的子域。

例如,当username1访问projectname.dev.mycompany.com时。然后,该用户将显示代码/ var / www / username1 / projectname /.

我想通过为每个用户使用不同的子域来阻止使用动态虚拟主机。这通常会在使用CMS时搞乱。

我有很长的路要走,但却陷入了使用重写规则的困境。这就是我目前所拥有的:

AuthType Basic
AuthName "The DEV"
AuthUserFile /var/www/.htpasswd
Require valid-user

RewriteEngine on
RewriteCond %{HTTP_HOST}   ^([^\.]+).dev.company.com$
RewriteRule ^(.+)$ /%{REMOTE_USER}/%1/html/$1

这导致内部重定向源源不断。当我将最后一次重写规则更改为^$而不是^(。+)$时,它适用于根URL,但不适用于所有其他URL。这些将被重写为/ var / www / $ 1。我尝试添加一个条件来检查我们是否还没有进入/%{REMOTE_USER},但这似乎无法解决任何问题。

我看到发生了什么,但我没有看到解决方案。我想阻止在子目录中添加另一个.htaccess规则,因为这应该与项目本身的.htaccess文件合并在一起。

2 个答案:

答案 0 :(得分:1)

我想我终于找到了它。这可能有助于将来的人们。第一步是创建/ var / www /的虚拟主机。在那里存储以下.htaccess文件:

AuthType Basic
AuthName "Typify DEV"
AuthUserFile /var/www/.htpasswd
Require valid-user

RewriteEngine on
RewriteCond %{REQUEST_URI} !/users/(.+)$
RewriteCond %{HTTP_HOST}   ^([^\.]+).dev.company.com$
RewriteRule ^(.*)$ /users/%{REMOTE_USER}/%1/html/$1

很遗憾,您无法在重写条件比较中使用%{REMOTE_USER}。您只能在右侧使用正则表达式。所以我将所有用户目录移动到了一个用户'子目录:

/var/www/users/username1/project1

现在我可以识别它是否已经被重写到该子目录。实际上非常简单的解决方案。

答案 1 :(得分:1)

也许这对将来需要类似mod_rewrite条件的人会有帮助。

确实,您不能在重写条件CondPattern中使用x-goog-iap-generated-response,但是可以在CondPattern内的串联TestString和正则表达式捕获组中同时使用%{REMOTE_USER}%{REMOTE_USER}

>
%{REQUEST_URI}