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

Выполнение двух перезаписей с помощью apache и модуля перезаписи вместе с webdav

Я пытаюсь настроить сервер WebDAV, который использует имя пользователя для перенаправления в частный каталог DAV. В каждом частном каталоге есть папка с именем Общая папка.

Идея состоит в том, что когда пользователь входит в систему, он сначала будет перенаправлен в свой личный каталог. При использовании модуля перезаписи в URL-адресе будет отображаться не путь, а только имя хоста, что не позволяет пользователям войти в другой частный каталог. Когда пользователь открывает фиксированную папку с именем Общая папка, mod_rewrite будет запускаться для соответствующего имени папки RewriteCond и перенаправлять в соответствующую общую папку, указанную в RewriteMap.

Моя конфигурация виртуального хоста:

LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
DBDriver mysql
DBDParams "host=db.example.com user=username pass=password dbname=webdav"

<VirtualHost *:80>
    Servername webdav.example.com

    DocumentRoot /var/www

    Options +FollowSymlinks
    RewriteLog "/var/log/httpd/rewrite.log"
    RewriteLogLevel 5
    RewriteEngine on

    RewriteRule ^(.*) /webdav/%{LA-U:REMOTE_USER}$1

    RewriteMap usergroup txt:/etc/httpd/usersingroups
    RewriteCond %{REQUEST_URI} ^/SharedFolder/ [NC]
    RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}} [L]

    <Directory "/var/www">
        DAV on
        Options +Indexes
                AuthName "example.com"
                AuthType Digest
                AuthDigestDomain /

                AuthDigestProvider dbd
                AuthDBDUserRealmQuery "SELECT digest FROM users WHERE username = %s AND unix_timestamp() < (ts+900) "

                Require valid-user
    </Directory>
</VirtualHost>

Содержание RewriteMap как следует:

fred sales/indoor/
bob sales/outdoor/
alice production/warehouse

Макет файловой системы находится под DocumentRoot / var / www. В / var / www две папки. Один называется / var / www / webdav и содержит все личные каталоги. Другая папка называется / var / www / sharedfolders и содержит каталоги, принадлежащие разным группам. Определив имя пути в RewriteMap Я могу определить, какой каталог группы отображается в пользователях Общая папка.

Проблема, с которой я столкнулся, заключается в том, что перенаправление на SharedFolder работает неправильно. Каждый файл или папка в личном каталоге пользователя доступны и могут использоваться. За исключением Общая папка. Когда я открываю это Общая папка, Я вижу его содержимое (это текстовый файл и папка), но я не могу открыть этот файл (так говорит мой рабочий стол). Журнал перезаписи показывает:

[webdav.example.com/sid#8ffd998][rid#9043870/initial] (2) rewrite '/webdav/fred/SharedFolder/Readme.txt/' -> '/sharedfolders/sales/indoor/'
[webdav.example.com/sid#8ffd998][rid#9043870/initial] (2) local path result: /sharedfolders/sales/indoor/
[webdav.example.com/sid#8ffd998][rid#9043870/initial] (2) prefixed with document_root to /var/www/sharedfolders/sales/indoor/
[webdav.example.com/sid#8ffd998][rid#9043870/initial] (1) go-ahead with /var/www/sharedfolders/sales/indoor/ [OK]

Когда я читаю журнал перезаписи, он сообщает мне, что файл (Readme.txt) не перезаписывается в конце для открытия.

Другая проблема связана с открытием папки внутри Общая папка. Я постоянно вижу содержимое Общая папка внутри себя. С WebDAV-диска: SharedFolder/folder a/folder a/folder a/folder a и так далее. Внутри каждой «папки a» я также вижу файл «Readme.txt». Вот что говорится об этом в журнале перезаписи:

[webdav.example.com/sid#8ffd998][rid#905d898/initial] (2) rewrite '/SharedFolder/bla/bla/bla/' -> '/webdav/fred/SharedFolder/bla/bla/bla/'
[webdav.example.com/sid#8ffd998][rid#904b850/subreq] (2) init rewrite engine with requested uri /webdav/fred/SharedFolder/bla/bla/bla/
[webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) init rewrite engine with requested uri /webdav/fred/SharedFolder/bla/bla/bla/
[webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) rewrite '/webdav/fred/SharedFolder/bla/bla/bla/' -> '/webdav//webdav/fred/SharedFolder/bla/bla/bla/'
[webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) local path result: /webdav//webdav/fred/SharedFolder/bla/bla/bla/
[webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) prefixed with document_root to /var/www/webdav/webdav/fred/SharedFolder/bla/bla/bla/
[webdav.example.com/sid#8ffd998][rid#904d858/subreq] (1) go-ahead with /var/www/webdav/webdav/fred/SharedFolder/bla/bla/bla/ [OK]

Думаю, я сделал еще несколько шагов, но недостаточно :-)

Некоторая справочная информация: изначально я пытался достичь той же цели с SharedFolder, используя символические ссылки, однако это кажется невозможным в сочетании с включенным WebDAV (я не мог заставить его работать).

ОС: RHEL5.8 Версия Apache: 2.2.3

заранее спасибо

ОБНОВИТЬ С учетом предложений @Jenny_D я внес несколько изменений. Я обновил свою текущую конфигурацию в code раздел в этом вопросе. Что я изменил:

  1. Убран $ 1 в конце RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}
  2. Добавлено [L] в конце той же строки.
  3. Изменил <Directory "/var/www/webdav"> к <Directory "/var/www"> так что перезаписанный путь (/ var / www / sharedfolders) также поддерживает DAV.

Последнее изменение (№ 3) имело большое значение: теперь я могу видеть содержимое Общая папка Ставил раньше (без WebDAV).

Проблема здесь:

RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}$1

Что вы делаете, так это перехватываете каталог, используемый в URL-адресе, сохраняете его в $ 1, а затем добавляете $ 1 в конец строки. Если вы не указали добавленную часть URL-адреса, просто удалите $ 1 в конце.

Чтобы остановить перезапись после правила общих папок, добавьте в конец флаг [L].

Итак, правило должно выглядеть так:

RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}} [L]

Нашел рабочую конфигурацию. Сейчас я использую следующее:

LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
DBDriver mysql
DBDParams "host=db.example.com user=username pass=password dbname=webdav"

<VirtualHost *:80>

Servername webdav.example.com

DocumentRoot /var/www

Options +FollowSymlinks
RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 2
RewriteEngine on

RewriteMap usergroup txt:/etc/httpd/usersingroups
RewriteCond %{REQUEST_URI} !^/SharedFolder [NC]
RewriteRule .? - [S=2]
RewriteRule ^/SharedFolder/(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}$1
RewriteRule .? - [S=2]

RewriteCond %{REQUEST_URI} !^/SharedFolder [NC]
RewriteRule ^(.*)$ /webdav/%{LA-U:REMOTE_USER}$1

<Directory "/var/www">
    DAV on
    Options +Indexes
            AuthName "example.com"
            AuthType Digest
            AuthDigestDomain /

            AuthDigestProvider dbd
            AuthDBDUserRealmQuery "SELECT digest FROM users WHERE username = %s AND unix_timestamp() < (ts+900) "

            Require valid-user
</Directory>
</VirtualHost>

Я создал конструкцию if-then-else, пропуская строки, если необходимо выполнить определенное условие. Кроме того, я также сделал RewriteRule для Общая папка немного конкретнее. Это в основном помогло. После этого диспетчер трафика (обратный прокси) поставил меня на неправильную ногу, выполняя разгрузку SSL на этот хост (отсюда и : 80 в <VirtualHost *:80>. Просмотр, загрузка и удаление работали нормально, за исключением переименования. Оказывается, когда вы переименовываете файл или папку в WebDAV, весь Заголовок назначения отправляется, а не просто путь при загрузке или удалении файла или папки. Так что имейте это в виду, когда вы выполняете какую-либо форму разгрузки SSL.