gpt4 book ai didi

Apache mod_rewrite 子域到子文件夹(通过内部重定向)

转载 作者:行者123 更新时间:2023-12-04 15:05:32 26 4
gpt4 key购买 nike

我正在尝试编写一组 mod_rewrite 规则,允许我的用户利用单个文件夹在不同的项目上进行开发,而不必为每个项目添加虚拟主机。

我的想法是为每个需要此功能的用户(仅 3-4 个)设置一个“全局虚拟主机”,虚拟主机类似于:.my-domain.com。从那里,我想促进我的用户编写代码,就像在域中一样,而不是在子文件夹中。例如,如果 bob 正在处理一个名为“gnome”的项目,我希望 bob(以及我们内部网络上的任何其他人)加载到该项目的 URL 为: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]

我发现的是以前 RewriteCond 的反向引用 future RewriteConditions 的 ConditionPattern 参数中不提供方向。如果您想使用以前 RewriteCond 的反向引用指令,您只能在 TestString 参数中使用它。

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

这听起来比实际更令人困惑,我不能因为发现答案而受到赞扬。我在这里找到了另一个问题的答案, %N backreference inside RewriteCond .感谢 Jon Lin回答那个问题,他不知道,我的问题呢!

关于Apache mod_rewrite 子域到子文件夹(通过内部重定向),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1167068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com