Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

XRS

.htacess mod_rewrite - rewriterule

Mensagens Recomendadas

XRS

Bom dia,


Venho pedir a vossa ajuda numa situação que me anda a atormentar à alguns dias que não sei como resolver ao nível do .htaccess.

Então para vos explicar melhor a situação, a estrutura do meu projeto tem:

  • header.php
  • index.php
  • footer.php

O acesso às páginas do site é feito através de /index.php?id=NOME_DA_PAGINA

Consoante o nome da página ele vai fazer o include de uma página existente. Se a página não existir carrega sempre uma página default.

Agora, tenho dois problemas com as minhas regras. Penso que a primeira seja fácil de resolver, mas não sei como farei com a segunda.

 

O meu .htaccess neste momento:

Options -Indexes
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$">
	Header set Cache-Control "max-age=28800"
</FilesMatch>

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteRule ^([a-zA-Z-]+)$ index.php?id=$1 [L]
RewriteRule ^([a-zA-Z-]+)/([a-zA-Z0-9-]+)$ index.php?id=$1&pid=$2 [L]

 

A primeira rewrite rule associa-se sempre a páginas principais como por exemplo:

site.test/profile/

A segunda regra é para quando existe uma segunda variável. Por exemplo editar uma categoria:

site.test/edit-category/3

Nota: O PHP está trabalhado para que quando (neste caso em especifico) um ID de categoria não existir, redirecciona para a página principal.

 

Agora a primeira questão:

  • Se colocar um caracter que não seja suportado, simplesmente dá erro de "Not Found" em vez de deixar o PHP fazer o trabalho. Por exemplo o link de teste: 
    site.test/edit-category/*

    Dá erro de "Not Found". O meu intuito é que estes erros não existam e redirecione sempre para a página principal. Se colocar um ID que não exista (seja por exemplo 32 ou asdasd) ele assume e redirecciona para a página principal. Neste sentido, deverei substituir [a-zA-Z-]+ e [a-zA-Z0-9-]+ por (.*) ou existe uma melhor forma de o fazer? Pelo que tenho lido sobre o assunto utilizar (.*) pode ser uma falha de segurança.

 

Agora a parte mais dificil a meu ver.

Eu tenho um sistema de categorias dinamicas. Neste sentido tenho um nível infinito de categorias, cujo link pode ser qualquer coisa. Independentemente das categorias, é suposto ir sempre para a mesma página enviando todos os ID's que serão depois tratados no PHP.

A estrutura é a seguinte:

  • A primeira parte da categoria (a categoria PAI) tem a informação sobre em que tabela da BD deverei fazer a query para encontrar os objetos seguintes;
  • A última parte da categoria, é a categoria que tenho que utilizar para procurar o que quero na tabela obtida no ponto anterior;

 

O meu problema, as categorias podem ter vários níveis, logo podem ser algo do género (por norma vão sempre três níveis, mas pode não acontecer): 

site.teste/carros/opel/corsa
site.teste/overboard/xy-77
site.teste/carros/fiat/punto/pneus

Ou seja, no primeiro exemplo , carros era o ID que tinha a informação em que tabela tinha que fazer a query e a última parte, corsa é a informação que tenho que ir procurar na base de dados.

A parte do PHP para mim é simples. Um split resolve o assunto. O meu problema passa pela forma que consiga criar estas rewrites rules no .htaccess. 

  • É suposto que qualquer uma das categorias vá parar para index.php?id=list&INFORMAÇÃO_DA_CATEGORIA
  • É suposto conseguir distinguir estas categorias dos links normais do site.

Como vou conseguir fazer isto de forma dinamica?

Por exemplo, eu consigo fazer isto se disser logo no .htaccess qual vai ser a categoria principal. Por exemplo se fizer algo tipo:

RewriteRule ^carros/(.*)$ index.php?id=list&pid=$1 [L]

Ele vai funcionar, mas dado que são categorias dinamicas e pode ser literalmente qualquer coisa, como vou descalçar a bota? É inviável estar sempre a adicionar ao .htaccess cada vez que crio uma categoria.


Alguma ajuda que me possam dar? Muito obrigado :)

Espero ter-me conseguido explicar nas dúvidas, mas se não for suficiente digam que tentarei explicar melhor. Obrigado.

Editado por XRS

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Sabes que estás a tentar resolver um problema que já foi resolvido à mais de uma década? 

Poderia abordar os dois pontos que referes aqui um de cada vez e mostra te que como poderias chegar a uma solução possível (ou impossível), mas acho que a melhor resposta que alguém te poderia dar será : usa uma framework que já exista, seja ela symfony, Laravel, Yii até mesmo CodeIgniter.

Não é uma questão de "mandar para canto" , é a melhor coisa que deverias fazer, porque aqui ninguém inventa a roda, por na realidade, a roda dá trabalho a ser inventada

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.