gpt4 book ai didi

apache - 通过子域的动态颠覆 repo (在 Apache 中)

转载 作者:行者123 更新时间:2023-12-01 13:03:25 25 4
gpt4 key购买 nike

我正在尝试在 Apache 中设置子域到存储库的转换。示例:

foobars.domain.com -> /server/svnrepos/foobars

我已经尝试使用 mod_rewrite 完成此操作:

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
RewriteRule ^/svn(.*) /svn/%2$1 [PT]

但是,这会导致基本的 svn 操作出现问题; 'checkout' 导致这个漂亮的东西:

$ svn co http://foobars.domain.com/svn
svn: '/svn/foobars/!svn/vcc/default' path not found

我在服务器设置(我的机器、操作系统等)方面没有任何限制。有没有办法让 Apache 处理这个翻译?我看过大量虚拟主机,但我没有看到将概念扩展到 DAV 位置的方法(我希望有一个 VirtualSvnPath...)。 mod_dav_svn 强制您 1) 明确定义您的 svn 存储库路径,或 2) 定义父级的方式非常有限。

也许“SVNSpecialURI”会有一些用处,尽管我找不到任何关于它的文档...

假设我的最终目标是将一个子域映射到一个 SVNPath,我有哪些选择?

我目前的 session 作为引用:

<VirtualHost *:80 *:443>
ServerAdmin admin@domain.com
DocumentRoot "/server/www"
ServerName domain.com
ServerAlias *.domain.com www.domain.com domain.com
ErrorLog logs/domain-error_log
CustomLog logs/domain-access_log common

DirectorySlash Off

RewriteLogLevel 9
RewriteLog /server/log/apache-rewrite.log

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
RewriteRule ^/svn$ /svn/ [QSA]

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
RewriteRule ^/svn(.*) /svn/%2$1 [PT]

<Location /svn>
DAV svn
SVNParentPath /server/svn
</Location>

最佳答案

为了开源(耶!),我将发布我的解决方案。我没有找到解决我的问题的内置解决方案,所以我花了几个小时研究 mod_dav_svn.so 源代码并想出了这个补丁:

Index: subversion/mod_dav_svn/mod_dav_svn.c
===================================================================
--- subversion/mod_dav_svn/mod_dav_svn.c (revision 1049733)
+++ subversion/mod_dav_svn/mod_dav_svn.c (working copy)
@@ -426,9 +426,14 @@
dav_svn__get_fs_parent_path(request_rec *r)
{
dir_conf_t *conf;
+ char *tokens, *subdomain, *last_str;

conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
- return conf->fs_parent_path;
+
+ tokens = apr_pstrdup(r->pool, r->hostname); // copy hostname
+ subdomain = apr_strtok(tokens, ".", &last_str);
+
+ return (const char *) apr_pstrcat(r->pool, conf->fs_parent_path, "/", subdomain, NULL);
}

本质上,这会获取当前主机名(来自待处理的请求“request_rec”),切掉第一个标记(子域),并将其与正确的 SVNParentPath (conf->fs_parent_path) 连接起来,瞧!一切正常。这是我的服务器配置(注意它现在是多么简单):

<VirtualHost *:80 *:443>
ServerAdmin admin@domain.com
DocumentRoot "/server/www"
ServerName domain.com
ServerAlias *.domain.com www.domain.com domain.com
ErrorLog logs/domain-error_log
CustomLog logs/domain-access_log common

<Location /svn>
DAV svn
SVNParentPath /server/svn
SVNListParentPath on
</Location>
</VirtualHost>

注意事项:

我希望我正确使用了 apr_* 函数,如果有任何注意事项,我希望得到一些反馈 :)

使用最新的 mod_dav_svn 树在 Centos 上测试。

关于apache - 通过子域的动态颠覆 repo (在 Apache 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4448275/

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