Jim*_*ein 6 apache mod-rewrite
我正在尝试编写一组mod_rewrite规则,允许我的用户使用单个文件夹在不同的项目上进行开发,而不必为每个项目添加vhosts.
我想要实现这个目标,就是为每个需要这种能力的用户设置一个"全球VHV"(只有3-4个),vhost就像:.my-domain.com.从那里,我想促进我的用户编写代码,就像它在域上,而不是在子文件夹中.例如,如果bob正在处理一个名为"gnome"的项目,我希望URL bob(以及我们内部网络上的其他任何人)加载到这个项目:http://gnome.bob.my- domain.com.但是,我希望Apache能做的是,认识到"gnome"是一个"项目",因此在内部将请求映射到bob.my-domain.com/gnome/.
我有我认为会起作用的东西,而且很简单,但是......它不起作用!该请求只是进入一个无限循环,并将子域前缀保留在重写的请求URI上.
我的mod重写代码是:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com
RewriteCond %{REQUEST_URI} !^/%1.*
RewriteRule ^(.*)$ /%1/$1 [L]
Run Code Online (Sandbox Code Playgroud)
我已经在谷歌上搜索了一下,但我还没有找到任何有效的解决方案.有没有人试过这个 - 或许,有没有人有更好的主意?一个不涉及为每个项目制作虚拟主机(我有设计师......我想每个人都会同意设计师不应该制作虚拟主机......)
谢谢!
这是rewrite_log的一个片段:
[rid#838dc88/initial] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/index.html -> index.html
[rid#838dc88/initial] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'index.html'
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^.]+)\.bob\.my-domain\.com' => matched
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='/index.html' pattern='!^/%1.*' => matched
[rid#838dc88/initial] (2) [perdir /home/bob/http/] rewrite 'index.html' -> '/gnome/index.html'
[rid#838dc88/initial] (1) [perdir /home/bob/http/] internal redirect with /gnome/index.html [INTERNAL REDIRECT]
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/gnome/index.html -> gnome/index.html
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'gnome/index.html'
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^\.]+)\.bob\.my-domain\.com' => matched
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='/gnome/index.html' pattern='!^/%1.*' => matched
[rid#8392f30/initial/redir#1] (2) [perdir /home/bob/http/] rewrite 'gnome/index.html' -> '/gnome/gnome/index.html'
[rid#8392f30/initial/redir#1] (1) [perdir /home/bob/http/] internal redirect with /gnome/gnome/index.html [INTERNAL REDIRECT]
[rid#8397970/initial/redir#2] (3) [perdir /home/bob/http/] add path info postfix: /home/bob/http/gnome/gnome -> /home/bob/http/gnome/gnome/index.html
Run Code Online (Sandbox Code Playgroud)
这只是一个片段,在apache达到其重写限制之前,有几个10或100左右的apache基本上重写/gnome/index.html到/gnome/gnome/gnome/gnome/gnome/index.html等,放弃,并抛出错误500
经过几年忽略这个问题,并在不同的点回到它,我终于找到了一个可行的解决方案.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/
RewriteRule ^(.*)$ /%1/$1 [L]
Run Code Online (Sandbox Code Playgroud)
我发现RewriteCond在将来的RewriteConditions的ConditionPattern参数中没有以前方向的反向引用.如果要使用先前RewriteCond指令的反向引用,则只能在TestString参数中使用它.
上述指令将第1个RewriteCond指令中匹配的子域添加到RequestURI,由分隔符组成::.然后我们在RewriteCond测试字符串(正则表达式)中执行的操作是重新捕获子域名,然后检查以确保我们的实际RequestURI不以该子域开头为使用同一正则表达式中的后向引用的文件夹.
这听起来比实际上更令人困惑,我不能因为发现答案而受到赞誉.我找到了答案作为对另一个问题的回答,在RewriteCond中%N反向引用.感谢Jon Lin回答这个问题,而且他也不知道,我的问题也是如此!