如何在文档根目录之外提供动态页面服务?

如何在文档根目录之外提供动态页面服务?

我正在尝试设置一个简单的网络应用程序,但遇到了一些困难。

以下是我的设置方法:

/srv/www/application <-- python code
/srv/www/public_html <-- document root

如果 Apache 能够找到 public_html 中的所有内容,我希望它能够提供这些内容,否则就将请求发送到我的应用程序。

我的虚拟主机文件片段:

    DocumentRoot /srv/www/public_html

    <Directory /srv/www/public_html>
            Options -Indexes
            RewriteEngine On
            RewriteBase /
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)$ ../application/code.py/$1 [L]
    </Directory>

我真的不确定../application,(因为我认为它重写为 url,而不是目录),我怀疑这就是它不起作用的原因,但我找不到让它工作的方法。

更新

我已经应用了 Cakemox 的建议,但仍然存在一些问题。以下是我所做的:

WSGIScriptAlias / /srv/www/application/code.py

这将所有内容路由到我的应用程序。奇怪的是,它只工作了一会儿,即在 public_html 中找到的文件被提供,其余文件被路由到我的应用程序,但我猜浏览器的缓存在捉弄我。

我也尝试过:

WSGIScriptAlias /application /srv/www/application/code.py

<Directory /srv/www/public_html>
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ application/$1 [L]
</Directory>

在大多数情况下,这种方法都有效,但默认 URL(mydomain.com)列出的是我的 public_html 目录,而不是运行应用程序。我猜是因为请求的文件名是 /srv/www/public_html,这是一个目录,所以条件为假。这很奇怪,因为我有无数应用程序在这些条件下运行良好……

更新 2 经过近两天的头脑风暴(我现在可以触摸我的大脑了),我想我终于明白了。我在上一段中提到的“众多应用程序”大多是 PHP 应用程序,其中应用程序 index.php 位于 public_html 文件夹中。因此,浏览 mydomain.com 时,Apache 首先搜索默认索引(DirectoryIndex)应用任何重写规则。由于我的 public_html 文件夹中没有任何 index.php、index.htm 或 index.html,因此它只列出了目录。因此,为了解决这个问题,我可以在条件前添加 DirectoryIndex /application 或 RewriteRule ^$ /application。以下是最终的代码片段:

<Directory /srv/www/public_html>
        DirectoryIndex /application
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ application/$1 [L]
</Directory>

谢谢。

答案1

我想到别名:

Alias /application "/srv/www/application"

答案2

我总是通过符号链接

ln -s /path/to/target localname

这仅当目标路径位于同一分区时才有效。

您还可以使用绑定挂载

mount --bind /path/to/orig/dir newdir/path

你可以继续bind mounts 重启后生效/etc/fstab

/my/real/dir /to/mount/dir auto rw,bind 0 0

相关内容