[英]Apache mod_rewrite a subdomain to a subfolder (via internal redirect)
我正在尝试编写一组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]
我已经在谷歌上搜索了一下,但我还没有找到任何有效的解决方案。 有没有人试过这个 - 或许,有没有人有更好的主意? 一个不涉及为每个项目制作虚拟主机(我有设计师......我想每个人都会同意设计师不应该制作虚拟主机......)
谢谢!
这是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
这只是一个片段,在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]
我发现在以后的RewriteConditions的ConditionPattern参数中没有以前的RewriteCond
方向的反向引用。 如果要使用先前RewriteCond
指令的反向引用,则只能在TestString参数中使用它。
上述指令将第一个RewriteCond
指令中匹配的子域添加到RequestURI,由::
分隔。 然后我们在RewriteCond
测试字符串(正则表达式)中做的是重新捕获子域名,然后检查以确保我们的实际RequestURI不以该子域开头作为在同一个正则表达式中使用后向引用的文件夹。
这听起来比实际上更令人困惑,我不能因为发现答案而受到赞誉。 我找到了答案作为对另一个问题的回答, 在RewriteCond中%N反向引用 。 感谢Jon Lin回答这个问题,而且他也不知道,我的问题也是如此!
你可能想检查一下
http://httpd.apache.org/docs/2.2/vhosts/mass.html
它处理您遇到的DocumentRoot问题。
规则就是这样的
VirtualDocumentRoot /var/www/%1/
您可以为适合您的任何内容更改%1( http://httpd.apache.org/docs/2.0/mod/mod_vhost_alias.html )
干杯
一些问题:
你说“内部地图” - 你不想使用重定向吗?
您是否在gnome.bob.mysite.com
和bob.mysite.com
使用相同的VirtualHost
你还记得为*.bob.mysite.com
创建ServerAlias吗?
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]',
您是否尝试过使用其他重写规则来处理之前的规则?
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 /更改为/。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.