2009-07-22 146 views
6

我试图编写一套mod_rewrite规则,允许我的用户利用单个文件夹在不同的项目上进行开发,而不必与添加虚拟主机为每一个单一的项目。Apache mod_rewrite一个子文件夹到子文件夹(通过内部重定向)

我的想法是为每个需要这种能力的用户(只有3-4个)设置一个“Global VHost”,这个虚拟主机就像是:.my-domain.com。从那里,我想促进我的用户编写代码,就好像它在一个域中,而不是在一个子文件夹中。例如,如果bob正在开发一个名为'gnome'的项目,那么我希望URL链接(以及我们内部网络上的其他人)加载到此项目中:http://gnome.bob.my-domain.com。但是,我希望Apache做的事情是认识到“gnome”是一个“项目”,因此将内部请求映射到bob.my-domain.com/gnome/。

我已经得到了我认为能够工作的东西,而且它非常简单,但是它不起作用!该请求只是进入无限循环,并将子域的前缀保留在重写的请求URI上。

国防部重写代码,我是:

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %{REQUEST_URI} !^/%1.* 
RewriteRule ^(.*)$  /%1/$1 [L] 

我张望了一下这个GOOGLE了,但我还没有找到任何工作,真正的解决方案。有没有人试过 - 或者,有没有人有更好的主意?一个不涉及为每个项目制作虚拟主机(我有设计师......我想每个人都会同意设计师不应该制作虚拟主机..)

谢谢!

下面是从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 

这仅仅是一个代码段,也有少数10S或100行左右的apache的基本上重写/gnome/index.html到/侏儒/侏儒/gnome/gnome/gnome/index.html等之前的Apache达到其极限改写,放弃,并引发错误500

+0

在重写日志中添加了一些更多信息,希望以前有人尝试过,或者对如何完成此操作有一些输入!谢谢你们(和加尔斯) – 2009-07-22 18:32:55

回答

5

几年后忽略了这个问题,回来的它在不同的点,我终于找到了一个可行的解决方案。

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/ 
RewriteRule ^(.*)$ /%1/$1 [L] 

我发现这又是以前RewriteCond方向反向引用不可未来RewriteConditions的ConditionPattern参数。如果您想使用以前的RewriteCond指令的反向引用,则只能在TestString参数中使用它。

以上指令预先在第一个RewriteCond指令中与RequestURI匹配的子域名,由::分隔。然后,我们在RewriteCond测试字符串(正则表达式)中执行的操作是重新捕获子域名,然后检查以确保我们实际的RequestURI不是以该子域作为使用相同正则表达式中的反向引用的文件夹开始的。

这听起来比实际上更令人困惑,而且我不能为发现答案而付出代价。我在这里找到了答案,作为对另一个问题的回答,%N backreference inside RewriteCond。感谢Jon Lin回答这个问题,对他不了解,也是我的问题!

0

一些问题:

你说:“内部地图” - 你不想要使用重定向?

您是否使用了gnome.bob.mysite.com相同的虚拟主机和bob.mysite.com

你记得创建ServerAlias为*.bob.mysite.com


这是一个粗略的版本,你可以修改工作。它将捕获子域和请求的URL,并将子域重定向到主域,作为路径的第一部分,后跟所请求的路径,后跟查询字符串。

ServerName www.mysite.com 
ServerAlias *.mysite.com 

RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9-]+)\\.mysite.com$ 
RewriteRule ^/(.*)  http://www.mysite.com/%1/$1  [R=301,L]',  
+0

我绝对想要一个内部重定向。这样做的目的是为了能够在链接,css,img srcs等上使用绝对路径。 对于 .my-site.com,将会有一个虚拟主机,并带有别名*。 .my-site.com,所以任何请求的域名 .my-site.com或以下将被该虚拟主机 – 2009-07-22 18:17:37

0

您是否尝试过使用另一个重写规则来处理它之前的一个?

RewriteEngine On 

RewriteCond %{HTTP_HOST}      ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %{REQUEST_URI}      !^/%1.* 
RewriteRule ^(.*)$        /%1/$1 [C]  
RewriteRule ^/(.*)\.bob\.my-domain\.com/(.*) /$1/$2 [L] 

但我认为你的更大的问题是,你的服务器不明白它是以不同的名字获得服务。

它认为它运行在/ gnome /目录中,而浏览器运行在/目录中。因此,您拥有的任何相对URL都会导致问题。

您需要的是一个过滤器,它将通过处理器在页面中运行所有URL,并将它们从/ gnome /更改为/。

+0

拿起,这个想法是阻止相关的URL,但在这种结构下,他们也应该工作。 – 2009-07-22 18:20:00

+0

另外,我相当肯定HTTP主机没有在RewriteRule中使用,只是URI – 2009-07-22 18:41:34

相关问题