Django + apache:如何创建一个服务器别名,它无形地重定向到服务器上的django应用程序?

时间:2010-10-16 19:03:56

标签: django apache

我试图弄清楚如何将服务器的特定别名转发到特定的django Web应用程序,同时,在用户的浏览器中保留URL地址栏以仅显示服务器别名。

更具体一点:

这是我公司的内部网项目。我们有一个很大的Linux服务器,可以完成大量的计算工作,并且还运行apache来提供各种网页和应用程序。我当前的django应用程序运行于:

http://deptserver.example.com/mydjangoapps/myapp

但是,如果我的用户可以使用它,我会很喜欢它:

http://myapp.example.com/

(我已经让IT人员通过DNS中的CNAME将myapp.example.com转发到deptserver.example.com)

我无法破解apache服务器上的任何内容,因为它服务于关键的东西,但我确实能够添加诸如VirtualHost或一些url重写规则等内容。

这是我在apache httpd.conf文件中设置的django:

<Location "/mydjangoapps">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mydjangopath.settings
    PythonOption django.root /mydjangoapps
    PythonPath "['/home/me/mydjangopath'] + sys.path"
    PythonDebug On
</Location>

而且,这是在启用网站的默认文件中(即我无法破坏服务器的这一部分):

<VirtualHost *:80>
        ServerAdmin webmaster@example.com
        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
</VirtualHost>

在上面的VirtualHost中,我尝试使用mod_rerwite:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^myapp\.example\.com
RewriteRule ^(.*) mydjangoapps/myapp$1

哪个不起作用,因为它认为mydjangoapps / myapp是文件路径而不是URL路径,因此它给出了400错误。我希望它转发到URL路径。

我也试过这个:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^myapp\.example\.com
RewriteRule ^(.*) http://deptserver.example.com/mydjangoapps/myapp$1

只是将用户转发到该长网址。

这些是我想过的但没有尝试过的东西: 虚拟主机 mod_rewrite的 别号 代理 (?) port(将我自己的apache服务器放在主服务器的不同端口上)

这样做的最佳方式(或唯一方法)是什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

请您的IT人员在该方框的网络接口上添加另一个IP地址(例如a.b.c.d),然后将myapp.example.com路由到该新的IP地址。

这样,您可以设置一个完全独立的VirtualHost:

<VirtualHost a.b.c.d:80>
    # Your configuration here
</VirtualHost>
<VirtualHost *:80>
    # The existing configuration here, unchanged
</VirtualHost>

然后,您只需将<Location "/mydjangoapps">更改为<Location "/">,即可通过http://myapp.example.com/的浏览器访问您的网站。

答案 1 :(得分:1)

正如AndrewF所说,VirtualHosts是前往这里的方式。如果您不想使用IP地址,可以使用name-based virtual hosting

进行设置
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName myapp.example.com
    (...etc...)

然后,该位配置将仅响应myapp.example.com上的请求,让标准配置接收其他所有内容。

在评论后进行编辑如果您使用的是基于Debian的系统,您似乎就像提到sites-enabled一样,那么您不应该在httpd.conf中添加任何内容 - 所有特定于站点的内容都应该在一个单独的文件中。此文件应该放在sites-available中,然后运行sudo a2ensite my_site_file以将其符号链接到启用站点的目录。