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 RewriteCond
não funciona mais. Existe alguma maneira de verificar dinamicamente se o caminho acessado por um caminho relativo ao .htaccess
arquivo.
Por exemplo:
Se eu tiver um site onde domain.com/prefix/
está o diretório do .htaccess
arquivo.
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 .htaccess
arquivo.
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 .htaccess
arquivos), tente usar a RewriteLog
diretiva: 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:-)