Я пытаюсь настроить сервер 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
раздел в этом вопросе. Что я изменил:
RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}
[L]
в конце той же строки.<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.