XRS Posted October 11, 2018 at 11:06 AM Report #612032 Posted October 11, 2018 at 11:06 AM (edited) 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. Edited October 11, 2018 at 11:06 AM by XRS
HappyHippyHippo Posted October 12, 2018 at 06:15 AM Report #612047 Posted October 12, 2018 at 06:15 AM 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 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
XRS Posted October 23, 2018 at 03:56 PM Author Report #612163 Posted October 23, 2018 at 03:56 PM Desde já peço desculpa por só agora responder mas isto tem andado muito dificil. @HappyHippyHippo obrigado pela tua sugestão, mas o objetivo é criar o projeto sem qualquer framework. Eu sei que elas existem para facilitar a vida e tal, mas existe a necessidade de ser "puro". No entanto permite-me também informar que o problema ficou resolvido com relativa facilidade. Fiz uma rewriterule simples para fazer a leitura das páginas e fiz o routing no PHP. Simples e eficaz. Na altura andei às voltas e não cheguei a esta conclusão. Queria "à força" resolver tudo no htaccess quando não ia ser possível. Obrigado mais uma vez pela tua sugestão. :)
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now