Назад | Перейти на главную страницу

Как обслуживать динамические страницы вне корня документа?

Я пытаюсь настроить простое веб-приложение, но у меня возникли трудности.

Вот как я его настроил:

/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>

Спасибо.

На ум приходит псевдоним:

Alias /application "/srv/www/application"

Я делаю это все время через символические ссылки:

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