Fazer duas reescritas com o módulo apache e reescrever junto com o webdav

1

Estou tentando configurar um servidor WebDAV que usa o nome de usuário para redirecionar para um diretório DAV privado. Em cada diretório privado, há também uma pasta chamada SharedFolder .

A ideia é que, quando o usuário fizer login, ele seja primeiro redirecionado para seu diretório privado. Usando o módulo de reescrita, não haverá nenhum caminho mostrado na URL, apenas o nome do host, que impede que os usuários digitem outro diretório privado. Quando o usuário abrir a pasta fixa chamada SharedFolder , o mod_rewrite será disparado no nome da dobra RewriteCond correspondente e redirecionado para a pasta compartilhada correspondente, conforme designado no RewriteMap.

Minha configuração de virtualhost:

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>

O conteúdo do RewriteMap é o seguinte:

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

O layout do sistema de arquivos está todo sob o DocumentRoot / var / www. Em / var / www existem duas pastas. Um é chamado / var / www / webdav que contém todos os diretórios privados. A outra pasta é denominada / var / www / sharedfolders, que contém diretórios pertencentes a diferentes grupos. Ao definir o nome do caminho no RewriteMap , posso determinar qual diretório de grupo é exibido nos usuários SharedFolder .

O problema que estou enfrentando é que o redirecionamento para o SharedFolder não funciona corretamente. Todo arquivo ou pasta no diretório privado de usuários é acessível e utilizável. Exceto o SharedFolder . Quando abro o SharedFolder , posso ver o seu conteúdo (que é um arquivo-txt e uma pasta), mas não consigo abrir esse arquivo (é o que a minha área de trabalho diz). O registro de reescrita mostra:

[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]

Quando eu leio o registro de reescrita, ele me diz que o arquivo (Readme.txt) não é reescrito no final para ser aberto.

O outro problema é abrir uma pasta dentro do SharedFolder . Eu vejo continuamente o conteúdo de SharedFolder dentro de si. A partir do disco WebDAV: SharedFolder/folder a/folder a/folder a/folder a e assim por diante. Dentro de cada 'pasta a' também vejo o arquivo 'Readme.txt'. Veja o que o registro de reescrita tem a dizer sobre isso:

[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]

Acredito que dei mais alguns passos, mas não o suficiente: -)

Algumas informações básicas: Inicialmente, tentei atingir o mesmo objetivo com o SharedFolder usando links simbólicos, mas isso parece impossível em combinação com o WebDAV ativado (não consegui fazê-lo funcionar).

SO: RHEL5.8 Versão do Apache: 2.2.3

Obrigado antecipadamente

UPDATE Com as sugestões de @Jenny_D fiz algumas alterações. Atualizei minha configuração atual na seção code desta questão. Coisas que eu mudei:

  1. Removamos o dólar 1 no final de RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}
  2. Adicionou [L] no final da mesma linha.
  3. Alterou o <Directory "/var/www/webdav"> para <Directory "/var/www"> para que o caminho reescrito (/ var / www / sharedfolders) também seja habilitado para DAV.

Esta última alteração (nº 3) fez uma grande diferença: agora posso ver o conteúdo do SharedFolder que coloquei anteriormente (sem o WebDAV).

    
por D43m0n 19.07.2012 / 15:23

2 respostas

0

Eu encontrei uma configuração de trabalho. Eu agora uso o seguinte:

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>

Eu criei uma construção if-then-else ignorando linhas se uma determinada condição precisa ser aplicada. Além disso, eu também tornei o RewriteRule para o SharedFolder um pouco mais específico. Isso basicamente fez o truque. Depois disso, fui colocado no pé errado pelo Traffic Manager (um proxy invertido) que faz o descarregamento de SSL para este host (daí o : 80 em <VirtualHost *:80> . A visualização, upload e exclusão funcionou apenas Mas quando você renomeia um arquivo ou pasta no WebDAV, o cabeçalho de destino todo é enviado, em vez de apenas um caminho ao carregar ou excluir um arquivo ou uma pasta. isso em mente quando você está fazendo alguma forma de descarregamento de SSL.

    
por 20.07.2012 / 14:27
1

O problema está aqui:

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

O que você está fazendo é pegar o diretório usado na URL, armazená-lo em $ 1 e depois anexar $ 1 ao final da linha. Se você não fizer o que essa parte do URL anexou, basta remover o valor de US $ 1 no final.

Para interromper a reescrita após a regra de compartilhamentos compartilhados, adicione o sinalizador [L] ao final.

Assim, a regra deve ficar assim:

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