Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá , Ja Andei procurando em Toda Internet sobre o Meu poblema mais infelizmente não consegui achar a Soluçao,éo seguinte , Tenho um arquivo .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id=$1 [L,QSA]
E No meu php esta assim:
<?php
$p = @$_GET['id'];
$arquivo = $p . ".php";
if (isset ($p)){
if (file_exists ($arquivo)){
include $arquivo;
} else { include "erro404.php"; }
} else {
include "home.php";
}
?>Ai que tá , que não sei como fazer :x , Tem como me dar um exemplo?
O exemplo já está no post #2:
>
RewriteRule ^post/([0-9]+)$ post.php?id=$1 [L,QSA]
Assim quando eu requisitasse /post/15 a minha requisição seria atendida e o script a ser carregado seria o post.php com o parâmetro id = 15 passados via GET, e eu não precisaria criar nenhum script que intermediasse a minha requisição porque eu já criei a regra de mapeamento no htaccess.
Agora na questão da Regex aí você precisa estudar para poder entender, criar as regras e mapear seus scripts. Há vários bons tutoriais internet afora.
Olá marcielo tentei fazer desta forma,post.php:
<?php
$aux = substr( $_SERVER['REQUEST_URI'], strlen('/'));
if( substr( $aux, -1) == '/'){
$aux=substr( $aux, 0, -1);
}
$urlARRAY___ =explode( '/', $aux);
?>
Htaccess:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ post.php?id=$1
</IfModule>
Porem quando digito localhost/post/16 que no caso 16 seria o id do post ele não me exibe o post , porque ? tentei entender enão consegui :/
Ok, então vos explicar-te-ei com mais clareza. Reforçando o que eu havia dito anteriormente há duas formas de se fazer, uma seria mapeando a url e parâmetros pelo htaccess, outro é mapear a requisição pelo PHP. Um dos quesitos fundamentais é ter o mínimo de conhecimento em Expressões Regulares. Como eu disse também, fazer o mapeando no PHP envolve vários conceitos e não é uma tarefa nada simples. Portanto vou mostrar o mapeamento via htaccess.
Primeiramente vamos entender o que cada linha do htaccess faz:
RewriteEngine on
Aqui não há o menor segredo, apenas habilita a reescrita de url.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond serve para expressar condições para as regras, há vários tipos de condições que podem ser aplicadas aí. No caso do exemplo acima não permitirá que as regras sejam aplicadas para nomes de arquivos, por exemplo => /post.php, urls que possuam extensão, já que no caso o formato que queremos é: /post/6876, essa regra é aplicável.
RewriteRule post/([0-9]+) post.php?id=$1 [L]
E por fim como eu havia mostrado antes, RewriteRule serve para expressar as regras de mapeamento de url, e os parâmetros são:
Rewrite regra destino flags
E é aqui que o bicho pega. Como no exemplo a flag L indica Last (última), ela serve para dizermos que se a regra for satisfeita o apache para de procurar outra e leve ao destino desta.
Agora que você já entendeu o que faz cada linha do seu htaccess é hora de entender o mapeamento. E como você já está craque nas Regex entenderá tudo direitinho :joia:
Você pode ver muitos (a maioria) da criação de regras de urls amigáveis pela internet semelhantes a essa:
^(.*)$ page.php?url=$1
O que está sendo feito aqui nada mais é que pegando o path da url e atribuindo à um parâmetro da QueryString para pegar depois. Há formas de se fazer isso no PHP, não precisa pegá-lo desta forma.
Agora vamos entender a regra que atenda /post/12345:
RewriteRule post/([0-9]+) post.php?id=$1 [L]
Observe a regra e veja o que há em comum com a url que queremos, post/... certo? Essa digamos que é a parte fixa da regra.
Pronto! Foi capturado o valor depois de post/ e colocado como o valor do parâmetro id!
Ao final o seu htaccess estaria assim:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule post/([0-9]+) post.php?id=$1 [L]
RewriteRule blog/([0-9]+) blog.php?page=$1 [L]
...
post.php:
<?php
var_dump($_GET);
Quando requisitado, /post/123, seria impresso:
array(1) {
["id"] => string(3) "123"
}
Você não precisaria criar nenhum código de redirecionamento porque você já fez nem de tratamento de parâmetros ou requisição porque já está feito no htaccess.
Espero que tenha esclarecido um pouco, caso tenha deixado passar algum ponto ou tenha ficado dúvidas, questione! ^_^ e por favor se não estudou, estude Expressões Regulares.
Muito Perfeito cara Obrigado mesmo e Ja começei a Estudar Expressoês Regulares nesta madrugada(Que é a melhor hora apra estudar) :clap:, Funcionou direitinho Me restou apenas uma duvida,e se No caso eu for fazer com um Titulo de postagem por exemplo: localhost/post/dragonball-tera-uma-continuacao , Como eu fasso ? fucei na net tbm não achei , Obrigado Mesmo Cara :joia:
fucei na net tbm não achei
Cada caso é um caso. Por isso é importante conhecer Regex para poder criar suas próprias regras conforme a necessidade.
e se No caso eu for fazer com um Titulo de postagem por exemplo: localhost/post/dragonball-tera-uma-continuacao
Não é aconselhável usar um parâmetro assim para identificar uma postagem, a não ser que ele fosse único na base e mesmo assim se trata de um título e deverá permitir duplicidade. Veja o exemplo aqui do fórum, antes do título na url, o que vem? O código do tópico. Não sei exatamente como é controlado aqui por baixo dos panos, mas acredito que o título seja apenas como uma forma de identificar visualmente a url, na questão de uma regra para ela no htaccess é novamente uma questão de conhecer Expressões Regulares, vou dar um exemplo de como a regra poderia ser feita:
RewriteRule post/([0-9]+)-([0-9a-zA-Z%-]+) post.php?id=$1&titulo=$2 [L]
Preste a atenção nas partes fixas post/id-titulo note o hífen que separa o id do titulo, deixamos ele fixo e tratamos as extremidades que são os valores que queremos obter, no lugar do hífen poderia ter uma barra ou qualquer outro carácter, é uma questão de gosto. A regra para o id continua a mesma, qualquer valor inteiro. Para o título especifiquei o intervalo de 0 à 9, letras de A à Z maiúsculas e minusculas, sinal de porcentagem para carácteres encoded e o hífen que separa as palavras do título. E por fim o + conforme expliquei anteriormente, ele diz que será aceito qualquer carácter especificado no conjunto de carácteres entre colchetes [].
Um outro ponto que é bom ser mencionado é em relação ao poder do mapeamento de urls. Se pode criar regras poderosas, um simples exemplo:
RewriteRule teste/([0-9]+) teste1.php?id=$1 [L]
RewriteRule teste/([a-zA-Z]+) teste2.php?id=$1 [L]
Nesse caso quando requisitássemos /teste/123 o script chamado seria o teste1.php, já se requisitássemos /teste/marcelo o script seria teste2.php. Isso foi apenas um simples exemplo de combinações que podem ser feitas.
Eu não consegui entender bulhufas desse código :huh: vamos ver mais de perto..
A primeira coisa que vi quando bati o olho no código foi:
>
$p = @$_GET['id'];
É algo que enche os olhos, mas são de lagrimas rsrs. Ocultando erro com @?? E o tratamento fica como?
>
if (isset ($p)){
O mais engraçado é que depois vem um isset() na variável $p mesmo depois até de usá-la rsrs, então porque não tratar de uma vez e atribuir?
>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id=$1 [L,QSA]
Você pega o path da url atribui à um parâmetro da Query String para pegar depois e chamar um arquivo correspondente. Esse é com certeza um dos piores métodos de se mapear url.
Acho que o que está te faltando é aprender um pouquinho de Regex isso já resolveria seu problema, talvez a sua intenção fosse algo como:
RewriteRule ^post/([0-9]+)$ post.php?id=$1 [L,QSA]
Assim quando eu requisitasse /post/15 a minha requisição seria atendida e o script a ser carregado seria o post.php com o parâmetro id = 15 passados via GET, e eu não precisaria criar nenhum script que intermediasse a minha requisição porque eu já criei a regra de mapeamento no htaccess.
Agora outro caso é fazer esse mapeamento no PHP, o que para mim é mais interessante. Porém não é algo simples, envolve muitos conceitos além de criar um script que encaminhe a requisição, é algo bem mais elaborado que isso.