Como fazer reescrever regras relativas ao arquivo .htaccess

3

Atual eu tenho um arquivo .htaccess como este.

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC]

RewriteRule ^(.*)$ router.php [L,QSA]

Funciona quando os arquivos do site estão no document_root do servidor web (por exemplo, domain.com/abc.php - > <DOCUMENT_ROOT>/abc.php ). Mas na nossa configuração atual (que não é alterável), isso não é garantido. Às vezes, podemos ter uma pasta arbitrária entre a raiz do documento e a pasta do arquivo .htaccess (por exemplo, domain.com/something/abc.php - > <DOCUMENT_ROOT>/something/abc.php ). O único problema é que o segundo RewriteCond não funciona mais. Existe alguma maneira de verificar dinamicamente se o caminho acessado por um caminho em relação ao arquivo .htaccess .

Por exemplo:

Se eu tiver um site em que domain.com/prefix/ seja o diretório do arquivo .htaccess .

NOT FORCED TO REWRITE -> domain.com/prefix/index.php
FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php

Se eu tiver um site em que domain.com/ seja o diretório do arquivo .htaccess .

NOT FORCED TO REWRITE -> domain.com/index.php
FORCED TO REWRITE -> domain.com/rewrite/index.php
    
por Kendall Hopkins 02.06.2010 / 23:48

3 respostas

1

Existe uma solução, mas não é simples.

Use RewriteMap .

Veja como eu faria:

Crie um arquivo RewriteMap . Consulte aqui para mais informações . Este é um ficheiro de texto muito simples com: primeiro, o URL errado sem o '/' , então um espaço (pelo menos) e depois o URL certo, da seguinte forma:

ok​ /folder1/
ok /folder2/
ok /folder3/

Em seguida, o código:

RewriteMap myfoldermap \
  dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map

RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)
# Now in '%1' there's the name of the folder
# Don't touch the URL but...
# ...check if it exists in the map file
RewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}]

# if the environment is neither empty or not found...
RewriteCond %{E:FOLDERMAP} !^(notfound|)$
# this means we found something...
# => apply the RewriteRule
RewriteRule ^(.*)$ router.php [L,QSA]

Se não funcionar: leia minhas "duas dicas" habituais e adicione o registro de regravação em sua pergunta.

Duas dicas:

Se você não estiver em um ambiente hospedado (= se for seu próprio servidor e puder modificar os hosts virtuais, não apenas os arquivos .htaccess ), tente usar a diretiva RewriteLog : ele ajuda você a rastrear esses problemas:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Minha ferramenta favorita para verificar o regexp:

link (não se esqueça de escolher ereg (POSIX) em vez de preg (PCRE)!)

    
por 28.01.2012 / 10:01
0

Se eu entendi corretamente (particularmente eu não sei o que você quer dizer com forçado a reescrever ), RewriteBase é para você.

BTW: não use coisas como domain.com :-)

    
por 03.06.2010 / 00:34
0

O Forçado a reescrever significa que a regra de reescrita deve funcionar mesmo se o arquivo ou diretório solicitado existir?

Se sim, tente evitar criar o arquivo / diretório.

Ou separe-o com duas regras:

RewriteRule ^/(always|rewrite|these|dirs)/ router.php [L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ router.php [L,QSA]

    
por 03.10.2010 / 15:42