.htaccess mod_rewrite - como excluir o diretório da regra de reescrita

145

Eu tenho 8 linhas de regras de reescrita no meu arquivo .htaccess. Preciso excluir dois diretórios físicos no meu servidor dessas regras, para que possam se tornar acessíveis. Por enquanto, todas as solicitações são enviadas para o arquivo index.php.

Diretórios a serem excluídos: "admin" e "user".

Portanto, as solicitações http: http://www.domain.com/admin/ não devem ser passadas para o arquivo index.php.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
Kelvin
fonte
Eu acho que você esqueceu os quantificadores depois de [^/]um espaço simples, se não for permitido lá (deve ser escapado com \<space>).
Gumbo
Verdadeiro Gumbo, boa captura :). deve ser ^ ([^ /] +).
Kelvin

Respostas:

287

Tente esta regra antes de outras regras:

RewriteRule ^(admin|user)($|/) - [L]

Isso encerrará o processo de reescrita.

quiabo
fonte
Olá Gumbo, seu código funcionou se o usuário digitar domain.com/admin/ (com barra final), mas não sem ele. Você o que pode ser alterado para os dois casos funcionarem? Obrigado
Kelvin
@ Kelvin: A alternância ($|/)deve lidar com ambos os casos.
Gumbo
Não é melhor usar RewriteCond aqui em vez de RewriteRule?
rineez
7
@rineez RewriteCondsempre exige um ao RewriteRulequal está anexado. E adicionar essa condição como negada RewriteConda cada um RewriteRulepode ser bastante volumoso, e mais simples do RewriteRuleque uma saída acima daquelas que devem ser ignoradas nesse caso é mais elegante.
Gumbo
3
@ Ergec Significa “não mude nada”.
Gumbo
112

O que você também pode fazer é colocar um arquivo .htaccess contendo

RewriteEngine Off

Nas pastas que você deseja excluir da reescrita (pelas regras em um arquivo .htaccess que fica mais alto na árvore). Simples mas efetivo.


fonte
18
O +1 ~ .htaccess opera hierarquicamente, portanto, as pastas locais substituem seus pais, como uma cascata normal em CSS ou MVC.
Atari
4
há apenas uma coisa que você deve ter em mente: ativar arquivos .htaccess (configurando AllowOverridepara qualquer outra coisa que não seja Nonena configuração do apache) força o apache a procurar .htaccess em cada solicitação. por isso, se você tem um site de alto freqüentado / webserver que sistema de arquivos / disco rígido de acesso poderia ter um impacto no desempenho imense ...
bohrsty
Conselho perfeito para validar a renovação de certificados SSL através do método de arquivo. Não há necessidade de modificar nada fora dos diretórios temporários ou no arquivo vhost. Depois que a validação estiver concluída, você pode excluir a pasta inteira e pronto. Apenas ótimo.
Countzero
25

adicione uma condição para verificar o diretório admin, algo como:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
Roubar
fonte
Olá Rob, eu coloquei esta linha logo após "RewriteBase /", e agora eu estou começando "Erro 500 - Internal Server Error"
Kelvin
@ Kelvin Eu editei minha resposta, adicione a condição antes de cada regra à qual você deseja aplicar.
4119 Rob
Este foi o único que realmente me ajudou. A resposta aceita se não me ajudar.
Uwe Keim
5

Se você deseja remover um diretório específico da regra (ou seja, deseja remover o diretório foo ), pode usar:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

O rewriteRule acima reescreverá todas as solicitações no /index.php, excluindo as solicitações do / foo / .

Para excluir todas as diretivas existentes, você precisará usar a seguinte condição acima de sua regra:

RewriteCond %{REQUEST_FILENAME} !-d

a seguinte regra

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

reescreve tudo (exceto diretórios) em /index.php .

Amit Verma
fonte
5

Usamos a seguinte regra mod_rewrite:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Isso redireciona (permanentemente com um redirecionamento 301) todo o tráfego para o site para http://www.newdomain.com , exceto solicitações de recursos nos diretórios / test e / / my-folder. Transferimos o usuário para o recurso exato solicitado, usando o grupo de captura (. *) E, em seguida, incluindo $ 1 no novo URL. Cuidado com os espaços.

Camilo Tilaguy
fonte
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
user3578691
fonte