Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wfelix

[Resolvido] mod_rewrite : redirecionar dependendo da existencia d

Recommended Posts

bom, seguinte... tenho o seguinte .htaccess na raiz:

 

Options -MultiViews -Indexes
ErrorDocument 404 /index.php



<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d 

RewriteRule .+ - [L]
RewriteRule ^([^/]+)$ index.php?perfil=$1 [QSA,L]

</IfModule>

 

 

e funciona beleza... tudo que for digitado na url como

http://www.meudominio.com/batatinha

, caso nao exista tal diretorio

 

é automaticamente interpretado como

http://www.meudominio.com/index.php?perfil=batatinha

 

funciona beleza... Faz exatamente o que deveria fazer, POREM eu preciso de um incremento: eu queria dar um jeito de, caso o que o cara digitar na url seja algo do tipo:

http://www.meudominio.com/batatinha/cenourinha.html

 

caso nao exista batatinha/cenourinha.html ele seja simplesmente redirecionado( um simples redirect) para a index.php da raiz

 

ou seja,

meudominio.com/batatinha mantem a regra que eu ja tenho

meudominio.com/batatinha/qualquer_coisa_que_nao_exista seja redirecionado pra index.php

 

ha como fazer isso?

 

abraços

 

ps:caso nao tenha uma maneira de fazer isso, tem como fazer com que o mod_rewrite ignore um diretorio especifico (batatinha, por exemplo) e nao aplique a s regras que eu ja tenho pra esse diretorio?

NAo sei se é a área correta pra postar, fiquei na duvida... Caso haja uma area especifica pra isso, algum moderador poderia mover pra mim, por favor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta dureza... procurando problemas similares com solução, nada ainda... Deve ser tão elementar pra quem sabe que nem tem muita "literatura" a respeito.

Se alguem souber, por favor, de uma ajudinha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Options -MultiViews -Indexes
ErrorDocument 404 /index.php

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

RewriteRule ^([^/]+)$ index.php?perfil=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f #se não for um arquivo
RewriteCond %{REQUEST_FILENAME} !-d #se tb não for um diretório
RewriteRule ^(.*)$ /index.php?dados=$1 [R=301,L] #redireciona para index.php, enviando os dados por QueryString
</IfModule>

 

Tá comentado o funcionamento. Não testei, mas acho que é isso.

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Matheus, mas se você reparar, isso faz o mesmo que o meu já esta fazendo, só que com uma regra a mais de variavel.

E nem chega na parte nova, porque a regra "RewriteRule ^([^/]+)$ index.php?perfil=$1 [QSA,L]" com esse L ja interrompe ali o processamento do arquivo :(

 

Não sei se redigi direito meu primeiro post, mas não é isso... ainda to procurando, deve existir em algum lugar alguem que tenha feito isso, porque me parece muito elementar.

 

 

vou dar um exemplo mais simples

quando o cara acessar:

http://www.meusite.net/pasta_especifica/arquivo_que_nao_existe.php

 

ele seja redirecionado(inclusive mudando a url e tudo, redirecionamento simples) para http://www.meusite.net/index.php

Compartilhar este post


Link para o post
Compartilhar em outros sites
E nem chega na parte nova, porque a regra "RewriteRule ^([^/]+)$ index.php?perfil=$1 [QSA,L]" com esse L ja interrompe ali o processamento do arquivo

Essa não é a função da Flag L.

 

Além disso, a condição que eu criei é inversa à sua.

Na sua a condição é:

Se o filename FOR um arquivo existente OU um diretório existente.

Na minha é:

Se o filename NÃO FOR um arquivo existente, tampouco um diretório existente.

 

Você chegou a testar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim...

 

esta fazendo basicamente a mesma coisa, com a excessao da flag r=301

 

 

bom, eu acho que nao me expliquei bem... o lance meu pronto ja esta fazendo o que eu quero pra coisas simples

 

http://www.meusite.net/pasta_que_nao_existe

 

faz

 

http://www.meusite.net/index.php?perfil=pasta_que_nao_existe

 

maravilha... o meu problema é quando tem algo mais

[code]http://www.meusite.net/pasta_que_nao_existe_ou_existe/arquivo_que_nao_existe.php

nesse caso eu queria um redirecionamento simples pra index.php, inclusive mudando a url, por conta dos paths relativos de css, imagens, etc...

 

 

e, se nao der pra fazer isso de modo coringa, que dese pra eu escolher as pastas em que isso acontecesse, ex:

http://www.meusite.net/pasta_especifica1/arquivo_que_nao_existe.php
http://www.meusite.net/outra_pasta_especifica/arquivo_que_nao_existe.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou rodar uns testes aqui então, e posto um resultado mais tarde. :natalsmile:

 

EDIT: Entendi que o problema é quanto aos seus CSS, JS, etc... beleza.

 

Me diga se os exemplos estão corretos:

 

http://curso.haxor.com.br/ -> acessa a index normalmente

http://curso.haxor.com.br/pasta_inexistente/ -> a pasta não existe, portanto o index.php interpreta como parametro do GET perfil

http://curso.haxor.com.br/pasta_existente/ -> a pasta existe, mas não precisamos mostrar seu conteúdo ao usuário, portanto vai pro GET perfil tb.. ( posso mudar isso se preferir - permitir a exibição de pastas existentes )

http://curso.haxor.com.br/arquivo_existente.php -> o arquivo existe, portanto o exibimos normalmente

http://curso.haxor.com.br/pasta_existente/arquivo_existente.css -> mesmo caso de cima

 

Código index.php:

<?php
echo '<pre>';
print_r( $_GET );

 

Código .htaccess:

Options -MultiViews -Indexes
ErrorDocument 404 /index.php

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?perfil=$1 [QSA,L]

</IfModule>

 

:bye:

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu Matheus...

Bom, funciona de maneira muito parecida com a qual o meu ja funciona... Ainda não rola a coisa elementar a que eu me referia, por exemplo:

 

http://curso.haxor.com.br/pasta_inexistente/arquivo_inexistente.php

em vez de redirecionar "duro" pra index, ele joga tudo isso: "pasta_inexistente/arquivo_inexistente.php" no GET['perfil'];

 

Esta ok, de qualquer forma, a sua maneira acaba sendo mais facil de trabalhar do que a minha esta, alterando o script da minha aplicação(o php)...

Eu queria um jeito menos "invasivo" só mexendo no .htaccess, mas acho que nao rola mesmo...

De qualquer forma, valeu, vou trabalhar com base no seu exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hummmm... testa assim então:

 

Options -MultiViews -Indexes
ErrorDocument 404 /index.php

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ /index.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?perfil=$1 [QSA,L]

</IfModule>

 

Se não for arquivo, manda pra index.php, 'duro'.

Se não for diretório, manda pra index.php, com parâmetros.

 

EDIT: isso vai resultar em erro 500, por loop infinito... estou trabalhando em cima disso.

 

:bye:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, vou te mostrar a aplicação, pra você ter uma ideia melhor do problema...

o meu .htaccess atual é:

Options -MultiViews -Indexes
ErrorDocument 404 /index.php



<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .+ - [L]
RewriteRule ^([^/]+)$ index.php?soparceiro=$1 [QSA,L]
</IfModule>


 

o site:

http://www.centraldeofertas.net/index.php

 

maravilha... mostrando ofertas de um unico parceiro:

http://www.centraldeofertas.net/grupoprive

 

mesma coisa, ainda recuperando o GET:

http://www.centraldeofertas.net/grupoprive?conteudo=oferta.php&id=447

 

 

 

uma pasta que nao existe como pasta, nem como parceiro, tambem funcionando a contento:

http://www.centraldeofertas.net/ofertassdar43

 

uma pasta que existe:

http://www.centraldeofertas.net/ofertas/

 

 

meu problema, dois casos:

 

1) http://www.centraldeofertas.net/ofertas/pagina_que_nao_existe.php

 

2) http://www.centraldeofertas.net/ofertassdar43/pagina_que_nao_existe.php

 

 

nesses 2 casos, por algum motivo que não sei, ele reescreve sim a pagina como se fosse a index.php, mas o path "interno" dele continua sendo "ofertas" ou "ofertassdar43", "zuando" o path(especialmente o que monta as imagens dinamicas das ofertas, e é só por isso o meu problema)...

 

nesses casos de arquivo que nao existe em diretorios acima da raiz, eu gostaria de um redirect "duro" pra index... inclusive mudando a url pra http://www.centraldeofertas.net/index.php

 

Saca? assim eu nao precisaria alterar nada nos arquivos do site propriamente dito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Feitoria..

E de quebra, você ganhou um anti-XSS e anti-SQL Injection via URL. :natallaugh:

 

Options -MultiViews -Indexes
ErrorDocument 404 /index.php

<IfModule mod_rewrite.c>
       RewriteEngine on

       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} ^.*\.([a-zA-Z]{3})$
       RewriteRule ^.*$ /index.php [R=301,L]

       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} ^([a-zA-Z/_-]*)$
       RewriteRule ^(.*)$ /index.php?perfil=$1 [QSA,L]

</IfModule>

 

Se digitar qualquer arquivo COM EXTENSÃO, que NÃO exista, tipo lalala.php ou lalala.css, ele manda direto pra index, sem choro nem vela.

Acessar um arquivo existente, é permitido.

Acessar uma pasta, existente ou não, manda pra index com a query string.

 

Acho que agora tá 100%.

Faça os testes na URL que te passei lá em cima.. vou deixar por umas horas on ainda. :natalhappy:

 

EDIT: O único porém é o fato de não mais aceitar ponto nos perfis, mas acho que isso já é assim no seu script php, né? Exemplo:

http://curso.haxor.com.br/fdsfsd.fsdfssd

Não aplica nenhuma regra nesse caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz...

 

OBRIGADÃO!

Realmente sou bem fraco no que diz respeito a expressão regular. Resolveu meu problema.

 

 

So tem uma ressalva boba, mas eu acho que "nunca" vai acontecer no meu caso, subpastas que existiam e nao existiam mais, em varios nivels, ex:

http://www.centraldeofertas.net/ofertas/parceiros/qualquer_pasta_inexistente

nesse caso, ainda ocorre o mesmo problema, MAS, acho muito dificil eu precisar arrumar esse caso(mas se for facil fazer isso alterando a expressão regular, tem como?)

 

 

Muito grato, me resolveu um problemão!

 

 

 

Edit: ta resolvido... esquece o lance dos multiplos niveis d eurl, nunca vai haver um link pra pasta sem ter um arquivo, dessa forma nunca chegara a ser um problema...

FICOU PERFEITO do jeito que está... agradeço demais mais uma vez, esse problema me consumiu muitas horas nesses ultimos 4 dias.

Moderador, pode por a tag [Resolvido] :D.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.