对于开发环境我在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文件合并在一起。
答案 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}