使用mod_rewrite时,WSGI 错误地处理了别名目录中的 PHP 脚本


PHP script in aliased directory mistakenly handled by WSGI when using mod_rewrite

all.所以我正在运行Apache 2.2。我有一个用于Django应用程序(通过mod_wsgi)的VirtualHost以及一个位于子目录中的PHP应用程序。通常,这没有问题。你可以只Alias /subdir /path/to/phpapp后跟WSGIScriptAlias / /path/to/django.wsgi

但是,复杂的是这个PHP应用程序使用mod_rewrite来实现"花哨的URL",这只意味着"/subdir/foo/bar"将被重写为"/subdir/index.php?path=foo/bar"。

这是我的配置:

<VirtualHost *:80>
    ServerName [snip]
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    Alias /phpapp/ /home/ubuntu/phpapp/
    <Directory /home/ubuntu/phpapp>
        Order allow,deny
        Allow from all
        RewriteEngine on
        RewriteCond $1 !^(index'.php|img|bin)
        RewriteRule ^(.*)$ index.php?__dingo_page=$1 [PT]
    </Directory>
    WSGIDaemonProcess foo user=ubuntu
    WSGIProcessGroup foo
    WSGIScriptAlias / /home/ubuntu/djangoapp/apache/django.wsgi
    <Directory /home/ubuntu/djangoapp/apache>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

问题是,每当重写发生时(例如,我尝试转到/phpapp 或/phpapp/foo),请求都会由 WSGI 处理,我看到我的 Django 站点的 404 页面。如果地址通过(例如,我转到/phpapp/index.php),那么它由 PHP 处理并正常工作。我想也许将 [PT] 标志添加到我的 RewriteRule 中可以解决这个问题,但它似乎对选择哪个处理程序没有任何影响。我也尝试了 PHP 应用程序的目录部分的SetHandler application/x-httpd-php

我需要 Django 应用程序继续处理任何没有专门别名到其他内容的 URL。一定有办法做到这一点!谢谢。

使用/phpapp 将永远不起作用,因为您在 Alias 指令的路径上有一个尾部斜杠。用:

Alias /phpapp /home/ubuntu/phpapp

根据权利,别名指令应优先于子URL的WSGIScriptAlias。

我建议您通过mod_rewrite启用日志记录并验证 URL 正在写入的内容。只要重写的 URL 仍然位于/phpapp 下方,就应该没问题。

另一种方法是不使用 WSGIScriptAlias,而是在以下末尾使用该方案作为大纲:

  • http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#The_Apache_Alias_Directive

这允许您进行设置,以便仅在无法映射静态资源(包括 PHP)的情况下将 Python Web 应用程序用作回退。