【问题标题】:Running a PHP script inside a Python WSGI enviroment在 Python WSGI 环境中运行 PHP 脚本
【发布时间】:2010-01-29 03:06:40
【问题描述】:

我有一个简单的 PHP 脚本,它以 XML 格式输出目录列表。我用它让 Flash 幻灯片知道可以显示哪些文件。

我刚刚将 flash 添加到由 Django 提供支持的网站中,并且 PHP 文件现在按原样提供,而不是解析。

它在我的媒体目录下的包含图像的目录中。

我使用的服务器运行 plesk,所以我在 vhost.conf 文件中为每个域进行配置(我认为它包含在主 appache conf 中)

看起来像这样:

WSGIScriptAlias / /var/www/vhosts/<domain>/conf/django.wsgi
Alias /media/ /var/www/vhosts/<domain>/httpdocs/media/

我认为这意味着对 / 下的任何内容的请求都会通过 django 来处理。
除非它们用于 /media/...,否则它们将由 apache 从指定的目录正常提供。

这适用于图像,但不解析 PHP 文件。

我该怎么办?

【问题讨论】:

    标签: php python django apache wsgi


    【解决方案1】:

    也许阅读此线程,并将您的 PHP 脚本移植到 Python:

    os.walk() python: xml representation of a directory structure, recursion

    【讨论】:

    • 我考虑将它写入我的 django 项目,但它实际上并没有自己的应用程序。它只是运行从共享源导入的我的 CMS 应用程序。我不知道如何将 Python 脚本提供给 URL,而不是通过 Django。我希望我所做的工作会奏效,如果我能做到的话,它会简单得多,并且允许我在 Django 和非 django 网站上使用相同的脚本。
    【解决方案2】:

    如果你没有配置 Apache,让它知道 '/media' 目录下的 .php 文件应该由 PHP 以某种方式处理,它们不会。所以,mod_wsgi 配置没问题,问题可能是你的 PHP 配置。

    你是如何配置 PHP 的?你是在使用 mod_php,还是通过 fastcgi 使用 PHP? Apache 是如何配置的,以便它知道将 .php 文件视为 PHP 以及该配置应用于哪些目录?

    【讨论】:

    • 如果我删除 vhost.conf 文件,它可以工作,但 Django 不能。所以我认为 PHP 的设置很好。
    • PHP 可以正常工作,但在这种情况下,您还没有正确配置 Apache。
    • Apache 必须设置为将 .php 文件视为 PHP,因为它在没有 Django 的情况下这样做。问题似乎是 apache 没有像往常一样处理文件,而是通过 mod_wsgi 运行它。请参阅伊格纳西奥的回答。
    • 在您的问题中发布与媒体目录相关的目录块作为后续。当人们从 mod_python 移出并在其中放入“SetHandler None”时,您并没有犯下错误。这将阻止 PHP 工作。使用 mod_wsgi 时,绝不应使用“SetHandler None”。
    • 感谢您的建议。一个可能的错误,但我没有犯过。
    【解决方案3】:

    WSGIScriptAlias 指令吞噬了指向 Alias 的 URL。交换订单。

    【讨论】:

    • 不,仍然提供文件而不解析它。 /media 下提供的其他文件以原始顺序与它们一起使用,所以我认为它不会被吞下。
    • 如果在某个时候 Django 项目已经设置为提供静态文件,那么它仍然会按照原始顺序进行设置。服务器上的其他 PHP 文件是否得到正确处理?
    • 好点。在本地开发人员的调试模式下,我在 /media 下有 django 设置文件。我已经测试并发现由于某种原因处于调试模式,我将检查我的配置。我还意识到我在反转这 2 行后忽略了重新启动服务器,重新启动导致 500 错误。我认为一旦我解决了这个问题,我就走在了正确的轨道上,所以谢谢。当我有时间测试它时会通知你。
    • 好的,所以即使没有 WSGIScriptAlias,只有一个普通的别名它仍然可以在不解析文件的情况下提供文件。它是由别名引起的,我的文件位于 ...httpdocs/media/test.php 和 Alias /media2/ ...httpdocs/media/ 它是从 domain.com/media/test.php 解释为来自 domain.com/media2/test.php 的原始代码。有谁知道如何改变这种行为?
    • 这阻止了我的浏览器认为该文件是下载文件。它现在显示 php 代码而不是给我文件。但它仍然没有解释它。 :(
    【解决方案4】:

    所以问题出在两件事上,很难找到。

    感谢 Ignacio Vazquez-Abrams,我的台词弄错了。

    一旦解决了这个问题,PHP 将不会为我的文件提供服务,因为它位于从 allowed path(s) 外部符号链接的目录中。我通过关闭此虚拟主机的 open_basedir 限制来解决此问题。下面是我的新vhost.conf

    <Directory /var/www/vhosts/<domain>/httpdocs>
        php_admin_flag engine on
        php_admin_value open_basedir none
    </Directory>
    
    Alias /media/ /var/www/vhosts/<domain>/httpdocs/media/
    
    WSGIScriptAlias / /var/www/vhosts/<domain>/conf/django.wsgi
    

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 1970-01-01
      • 2018-07-11
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多