![如何在文档根目录之外提供动态页面服务?](https://linux22.com/image/526919/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%96%87%E6%A1%A3%E6%A0%B9%E7%9B%AE%E5%BD%95%E4%B9%8B%E5%A4%96%E6%8F%90%E4%BE%9B%E5%8A%A8%E6%80%81%E9%A1%B5%E9%9D%A2%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
我正在尝试设置一个简单的网络应用程序,但遇到了一些困难。
以下是我的设置方法:
/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"