.htaccess - Simulando o link errado do host virtual para o diretório pai na listagem de diretórios

1

Eu tenho um domínio dedicado para meu servidor local (.dev) e um arquivo .htaccess que redireciona solicitações como http://folder.dev/subfolder/ para /htdocs/folder/subfolder . Funciona muito bem e tudo, exceto por um problema menor. Quando tenho a listagem de diretórios ativada, posso acessar todas as pastas, subpastas e arquivos corretamente, exceto quando clico no link Parent Directory , que, por exemplo, deve levar a http://folder.dev , mas redireciona para http://folder.dev/folder/ e consequentemente, lança 404 not found . Da mesma forma, se Parent Directory deve vincular a http://folder.dev/subfolder/ , ele será vinculado a http://folder.dev/folder/subfolder/ . Aqui está como meu .htaccess se parece:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
RewriteCond %{ENV:REDIRECT_SUBDOMAIN} =""
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9][-a-z0-9]+)\.dev\.?(:80)?$ [NC]
RewriteCond %2 !^www|ftp|mail|pop3|localhost$
RewriteCond %{DOCUMENT_ROOT}/%2 -d
RewriteRule ^(.*) %2/$1 [E=SUBDOMAIN:%2,L]
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN}]

Além disso, tudo funciona bem (por exemplo, links relativos em documentos, etc.)

    
por Томица Кораћ 10.01.2013 / 14:58

1 resposta

0

Isso acontece porque, quando o Apache mostra o índice do diretório, ele avalia o link "Diretório pai", dependendo do DocumentRoot do host virtual e do diretório atual.

Eu acho que você usa o diretório /htdocs para ser a raiz do documento folder1.dev , folder2.dev e todos os outros domínios .dev, e você coloca o seu .htaccess em /htdocs/.htaccess .

Quando você vai para http://folder.dev/subfolder/ (a raiz do documento é /htdocs/ ), seu .htaccess mostra /htdocs/folder/subfolder/ . O caminho relativo da raiz do documento para esse diretório é folder/subfolder . Quando o Apache calcula o link do diretório pai de um diretório atualmente exibido, é preciso http:// + folder.dev + dirname('folder/subfolder') , ou seja, é igual a http://folder.dev/folder/ e NÃO apenas http://folder.dev/ como seria de se esperar.

Seria possível fazer o check-in do .htaccess, se o primeiro elemento do caminho após o nome do domínio for igual ao subdomínio e redirecionar para o root:

  1. Temos http://folder.dev/folder/ .
  2. Vemos essa "pasta" (subdomínio) == "pasta" (elemento do primeiro caminho).
  3. Redirecionar para http://folder.dev/ .

Mas, se você fizer isso, não será possível acessar os caminhos como /htdocs/folder/folder/ , em que o primeiro elemento do caminho é de fato o mesmo que o nome do subdomínio.

Dado que, você não pode resolver este problema apenas com .htaccess e mod_rewrite.

Outras soluções:

  1. Use o host vitrual para qualquer pasta que você gostaria de acessar. Nenhuma magia de .htaccess exigida. As configurações do Vhost podem ser geradas a partir da lista de pastas. Solução mais flexível, pois é possível criar qualquer vhosts, com qualquer opção de configuração, para qualquer pasta onde quer que eles estejam.
  2. Use mod_vhost_alias . Mais fácil, não requer habilidades de script, mas pode exigir alterações na nomenclatura da pasta para conversão automática entre folder_name e document_root.
  3. Use HeaderName em .htaccess para adicionar o cabeçalho a todas as páginas de índice. Use o jQuery para alterar o link do diretório pai da maneira que desejar. Parece um hack sujo, mas vai funcionar.
por 20.10.2013 / 22:58