Como fazer regras de reescrita em relação ao arquivo .htaccess

Como fazer regras de reescrita em relação ao arquivo .htaccess

Atual, 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 (ou seja, domain.com/abc.php-> <DOCUMENT_ROOT>/abc.php). Mas na nossa configuração atual (que não pode ser alterada), isso não é garantido. Às vezes podemos ter uma pasta arbitrária entre a raiz do documento e a pasta do arquivo .htaccess (ou seja, domain.com/something/abc.php-> <DOCUMENT_ROOT>/something/abc.php). O único problema é que o segundo RewriteCondnão funciona mais. Existe alguma maneira de verificar dinamicamente se o caminho acessado por um caminho relativo ao .htaccessarquivo.

Por exemplo:

Se eu tiver um site onde domain.com/prefix/está o diretório do .htaccessarquivo.

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

Se eu tiver um site onde domain.com/está o diretório do .htaccessarquivo.

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

Responder1

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

Usar RewriteMap.

Aqui está como eu faria:

Criar umaReescreverMapaarquivo. Veraqui para mais informações. Este é um arquivo de texto muito simples com: primeiro, o URL erradosem o '/', entãoum espaço(pelo menos) e depois o URL certo, assim:

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

Então 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 log de reescrita na sua pergunta.

Duas dicas:

Se você não estiver em um ambiente hospedado (= se for seu próprio servidor e você puder modificar os hosts virtuais, não apenas os .htaccessarquivos), tente usar a RewriteLogdiretiva: ela ajuda você a rastrear tais 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 regexp:

http://www.quanetic.com/Regex(não se esqueça de escolher ereg(POSIX) em vez de preg(PCRE)!)

Responder2

FazForçado a reescreversignifica que a regra de reescrita deve funcionar mesmo se o arquivo ou diretório solicitado existir?

Se sim, tente evitar a criação do arquivo/diretório.

Ou separe-o em duas regras:

RewriteRule ^/(sempre|reescrever|estes|diretórios)/ roteador.php [L]

ReescreverCond %{REQUEST_FILENAME} !-f

ReescreverCond %{REQUEST_FILENAME} !-d

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

Responder3

Se bem entendi (particularmente não sei o que você quer dizer comforçado a reescrever),RewriteBaseé para você.

POR FALAR NISSO:não use coisas comodomínio.com:-)

informação relacionada