AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 111000
Accepted
user34260
user34260
Asked: 2010-02-09 20:18:02 +0800 CST2010-02-09 20:18:02 +0800 CST 2010-02-09 20:18:02 +0800 CST

动态子域,mod_python 和 trac

  • 772

我将运行多个子域,最终太多子域无法拥有自己的配置文件。我让虚拟主机按我想要的方式工作,因此每个子域都有自己的文件夹,例如 /web/test 将为该子域提供网页。我想让每个子域都有自己的 SVN 和 trac 项目,例如 http://test.mastersiege.com/trac 问题是你不能在 apache 中使用变量。

<Location /trac>
   SetHandler mod_python
   PythonInterpreter main_interpreter
   PythonHandler trac.web.modpython_frontend 
   PythonOption TracEnv /var/trac/$1
   PythonOption TracUriRoot /trac
</Location>

其中 $1 = 子域。而且我无法将 trac 文件夹符号链接到子域主文件夹中,然后将 vhost_alias 的文档根用作 TracEnv。我尝试在 apache 配置文件中编写一个 Perl 脚本,该脚本从 URL 解析子域,就像在 Vhost 容器中动态使用带有 mod_perl 的 URL但它没有 用

            use Apache2::ServerRec () ;
            use Apache2::ServerUtil ();
            use Apache2::RequestRec ();
            use Apache2::RequestUtil ();
            use Apache2::Const qw/OK DECLINED/;
            my $s = Apache2::ServerUtil->server;

            $s->push_handlers(PerlHeaderParserHandler => sub { my($r) = @_;
            if ( $r->hostname =~ m/(.*)\.([^.]+\.\w+)$/ ) {
            my($subdomain,$domain) = ($1,$2);

            my($TracPath) = "TracEnv /srv/trac/"+$subdomain;
            my($TracUri) = "TracUriRoot /testTrac";
            $Location{"/testTrac/"} = {
            SetHandler => "mod_python",
            PythonInterpreter => "main_interpreter",
            PythonHandler => "trac.web.modpython_frontend",
            PythonOption => $TracPath,
            PythonOption => $TracUri
            };

            if ( $@ ) { warn $@ }

            return OK;

            } else {
            return DECLINED;
            }
            });
    </Perl>

那是我的第一个 perl 脚本,所以我不确定.. 可以使用 cgi for trac 来解决问题,但它比 mod_python 慢 100 倍

apache-2.2 virtualhost trac mod-rewrite mod-perl
  • 1 1 个回答
  • 567 Views

1 个回答

  • Voted
  1. Best Answer
    silk
    2010-02-10T13:36:56+08:002010-02-10T13:36:56+08:00

    我会将 mod_python 更改为 mod_wsgi。在此配置中,您可以使用环境变量设置 TRAC_PATH。

    示例静态配置的一些摘录:

        WSGIDaemonProcess tracproc user=www-data group=www-data processes=1 threads=25
        WSGIProcessGroup tracproc
    
       <Directory /srv/wsgi>
            WSGIProcessGroup tracproc
            Order deny,allow
            Allow from all
            WSGIApplicationGroup %{GLOBAL}
        </Directory>
    
       <Location /trac>
            Require valid-user
            AuthType Basic
            ...
        </Location>
        WSGIScriptAlias /trac /srv/wsgi/trac-stable.wsgi
    
        RewriteCond %{REQUEST_URI} ^/trac/ [OR]
        RewriteCond %{REQUEST_URI} ^/trac$
        RewriteRule . - [E=trac.env_path:/srv/tracenv]
    

    您必须测试并确定如何将 RewriteRule 中的子域或域获取到 [E=...]。

    您可以在设置 env 时使用模式中的反向引用(例如[E=trac.env_path:%1]。我不确定您是否可以在那里使用其他 env 变量[E=trac.env_path:%{HTTP_HOST}],文档对此没有说明。我想您应该能够做到这一点。如果没有,那么 RewriteRules 的更多魔法可能会有所帮助。

    trac-stable.wsgi 供参考:

    import sys
    sys.stdout = sys.stderr
    
    # when Trac is not in default python sitedir
    #import site
    #site.addsitedir('/opt/trac-0.11/lib/python2.5/site-packages')
    
    __requires__ = 'Trac=0.11.6'
    from pkg_resources import load_entry_point
    
    import os
    os.environ['PYTHON_EGG_CACHE'] = '/srv/python_eggs'
    os.environ['LC_TIME'] = 'pl_PL.UTF-8'
    
    import trac.web.main
    
    application = trac.web.main.dispatch_request
    

    后来的想法 - 如果无法使用,[E=trac.env_path:%{HTTP_HOST}]那么您可以使用 env 变量传递尽可能多的内容,并在 trac-stable.wsgi 中构造 env.env_path。

    • 3

相关问题

  • 阿帕奇的替代品

  • 如何强制我的网址始终以 www 开头?

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • mod_rewrite 不转发 GET 参数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve