Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá,
Tenho o seguinte htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^contato/?$ /contato.php[NC,L]
RewriteRule ^/(.*)$ /posts.php?id=$2slug=$1 [NC,L]
</IfModule>
Acontece que a pagina contato
quando digitado www.meusite.com.br/contato aparece o header com os estilos css corretamente, mas não aparece os resumos de postagens nem mais nada
quando digitado www.meusite.com.br/contato/ fica sem os estilos css e não aparece alguns resumos de postagens
quando digitado www.meusite.com.br/contato.php vai tudo ok
já a regra:
RewriteRule ^/(.*)$ /posts.php?id=$2slug=$1 [NC,L]
Não quero que o id apareça na url amigavel
atualmente os links estão assim:
www.meusite.com.br/post.phpid=20slug=o-titulo-do-post
quando acesso:
www.meusite.com.br/o-titulo-do-post
aparece que a pagina não existe (not found)
Apache/2.4.9 (Win32) PHP/5.5.12 Server at meusite.com.br Port 80
Atualmente os links estão assim, na página que tem botões para os posts:
<a href="posts.php?id=<?php echo $value['id'] ?>slug=<?php echo $value['slug'] ?>" >Ver</a>
Mas se eu coloco só o slug:
<a href="<?php echo $value['slug'] ?>" >Ver</a>
Não vai passar o id para a url. Sei que é uma pergunta boba, mas estou aprendendo e até agora não consegui entender muito bem como vai abrir corretamente o link amigavel sem passar o id no href
Agradeço ajuda
mas no botão
<a href="<?php echo $value['slug'] ?>" >Ver</a>
precisa colocar slug= ??
<a href="<?php echo **slug=**<?php echo $value['slug'] ?>"nao
Não funcionou
no url vai para
http://site.com.br/minha-slug-vinda-do-db
e parece a mensagem na pagina:
The requested URL /minha-slug-vinda-do-db was not found on this server.
poste como ta o link no html, nao no php e como ta a regra no .htaccess
tenha em mente que ele tem que redirecionar para -> posts.php
ou seja ele tem que achar esse arquivo
arquivo contato.php
esta assim:
//outro conteudo html
// abaixo começa uma lista de links para ir para alguns posts
<?php
$query = "SELECT * FROM minha_tabela";
$variable = $crud->verdados($query);
foreach ($variable as $key => $value) {
?>
<div >
<h3><?php echo $value['titulo_post'] ?></h3>
<p><a href="posts.php?id=<?php echo $value['id'] ?>slug=<?php echo $value['slug'] ?>">ver</a></p>
</div>
<?php
}
?>
o arquivo posts.php esta assim:
<?php
$id = $_GET['id'];
$stmt = $DB_con->prepare("SELECT * FROM minha_tabela WHERE id=:id");
$stmt->execute(array(":id"=>$_GET['id']));
while($row=$stmt->fetch(PDO::FETCH_BOTH))
{
?>
//conteudo html
<h1><?php print($row['titulo_post']);?></h1>
<p> <?php print($row['texto_post']);?></p>
<?php
}
?>
clicando em algum link na página contato.php vai para a pagina posts:
http://meusite.com.br/posts.php?id=20slug=minha-slug-vinda-do-db
e aparece tudo ok, titulo e conteúdo de acordo com o id, mas isso até aqui sem a url amigável
se eu deixar o id na url amigável:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^contato/?$ /contato.php [NC,L]
RewriteRule ^/(.*)(.*)$ /posts.php?slug=$1&id=$2 [NC,L]
</IfModule>
no link no arquivo contato.php eu passo assim??
<a href="<?php echo $value['slug'] ?><?php echo $value['id'] ?>"
pois assim também esta aparecendo erro
The requested URL /minha-slug-vinda-do-db20 was not found on this server.
como que o php vai saber que o 20 no final da url é um id se não tem a referencia id= que é o que $_GET['id'] esta buscando??
>
como que o php vai saber que o 20 no final da url é um id se não tem a referencia id= que é o que $_GET['id'] esta buscando??
se nao tem o ID a busca é feita pelo titulo
É ISSO QUE EU TO TENTANDO TE DIZER DESDE O SEU ULTIMO TÓPICO MAS você NÃO QUER ENTENDER DE JEITO NENHUM
falei aqui http://forum.imasters.com.br/topic/540252-htaccess-url-amigavel/?p=2158392
e aqui http://forum.imasters.com.br/topic/540486-url-amigavel-usando-slug/?p=2159273
você disse isso nesse topico
Não quero que o id apareça na url amigavel
você tendo dito isso
eu respondi isso http://forum.imasters.com.br/topic/540486-url-amigavel-usando-slug/?p=2159273
você tem que decidir o que quer da vida
É NECESSÁRIO O ID NA SUA URL??
como esse?
forum.imasters.com.br/topic/540486-url-amigavel-usando-slug/
ou sem como esse
blog.thiagobelem.net/gerenciando-assets-com-o-bower/
se nao tem ID nao precisa de 2 parametros aqui /posts.php?id=$2slug=$1
ja disse isso no 2 segundo post
quando eu disse
poste como ta o link no html, nao no php e como ta a regra no .htaccess
eu queria saber como tava ficando o html do link
Eu entendi em relação a regra no htaccess
^/(.*)$ /posts.php?slug=$1
^ inicio da regra
$ fim da regra
(.*) regra referente ao $1
/posts.php?slug=$1 url que sera mudada.
mas o que acontece é que seguindo as dicas que você passou nenhuma funcionou nem sem o id nem com id.
se não esta funcionando buscando o id.
e fazer
$slug = $_GET['slug'];
$stmt = $DB_con->prepare("SELECT * FROM minha_tabela WHERE slug=:slug");
$stmt->execute(array(":slug"=>$_GET['slug']));
while($row=$stmt->fetch(PDO::FETCH_BOTH))
{
?>
como ele vai saber que o slug que esta na url é o conteudo do $1 se nem tem menção tanto no link html nem na url do atributo **slug= ** que é exatamente o que o $_GET['slug']; busca na url.
entende? é essa minha duvida
quanto ao botão html já respondi:
// url não amigavel que funciona
<a href="posts.php?id=<?php echo $value['id'] ?>slug=<?php echo $value['slug'] ?>">ver</a>
//url somente slug
<a href="<?php echo $value['slug'] ?>">ver</a>
abre http://meusite.com.br/minha-slug-vinda-do-db
//mas aparece
The requested URL /minha-slug-vinda-do-db20 was not found on this server.
>
como ele vai saber que o slug que esta na url é o conteudo do $1 se nem tem menção tanto no link html nem na url do atributo slug= que é exatamente o que o $_GET['slug']; busca na url.
entende? é essa minha duvida
"ele" vai saber? ele quem?
Há três coisas aqui:
1. Servidor WEB
2. PHP
3. Banco de dados
O Servidor WEB vai pegar tudo após e barra e colocar na URL post.php?slug=<aqui vem o slug que o servidor encontrou>. O serviço acaba aqui.
Depois o PHP vê $_GET['slug']. Esse valor vaio do Servidor Web.
O Banco de dados recebe esse valor no WHERE.
Ou seja, o $1 que você mencionou acaba no .htaccess, que é serviço do Servidor Web. Daí em diante só vai existir esse valor na URL pro PHP. $1 não fará sentido pro PHP, apenas $_GET['slug']
Pra buscar o post no BD é super simples: filtre usando um identificador. Tanto faz se é ID ou Slug. Apenas é necessáiro que seja um identificador único. O Wordpress, por exemplo, além do ID salva o slug na tabela. Por isso é possível ter só o slug na URL, sem o ID.
Simples assim.
Se na tabela esta salvo o slug entao o
WHERE slug=:slug vai encontrar o seu post mesmo sem o ID
quanto ao botão html já respondi:
nao, nao respondeu
eu perguntei como o link html ta ficando, você esta mostrando o PHP
>
"ele" vai saber? ele quem?
Há três coisas aqui:
1. Servidor WEB
2. PHP
3. Banco de dados
Post #7
>
The requested URL /minha-slug-vinda-do-db20 was not found on this server.
como que o php vai saber que o 20 no final da url é um id se não tem a referencia id= que é o que $_GET['id'] esta buscando??
ele o PHP rsrsrs
----------
/posts.php?slug=$1 //servidor web
Electronic parte html/php que contém link é esse trecho:
<a href="<?php echo $value['slug'] ?>">ver</a>
tem que colocar mais algum atributo html??
pq quando clicado vai para: meusite.com.br/slug-aqui, mas aparece a pagina em branco escrito:
The requested URL /slug-aqui was not found on this server.
É muita burrice minha rsrs não ta entrando no "célebro". Se eu não coloco no link nem referencia a pagina posts.php nem referencia ao atributo slug=
Como que tanto ele o servidor web, sabera que o link http://meusite.com.br/slug-aqui (sem atributo slug= nem nada) esta ligado ao arquivo posts.php???
e como que ele o PHP vai saber http://meusite.com.br/slug-aqui que a segunda parte da url:
/slug-aqui
se trata do slug= chamado no $_GET['slug'] ???? sendo que nem no link nem na url tem menção ao slug=
Como que tanto ele o servidor web, sabera que o link http://meusite.com.br/slug-aqui (sem atributo slug= nem nada) esta ligado ao arquivo posts.php???
Porque você ta reescrevendo a url
RewriteRule ^([a-z]+)\/?$ posts.php?slug=$1 [NC,L]
quando você chamar
meusite.com.br/slug-aqui
o servidor vai ver que slug-aqui se encaixa nessa regra ^([a-z]+)\/?$
logo ele vai reescrever, vai chamar o arquivo php posts.php?slug=slug-aqui
outro exemplo
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)$ teste.php?action=$1&model=$2&id=$3 [NC,L]
você vai chamar no servidor wbruno.com.br/edit/user/1
o servidor vai ver que isto edIt/user/1 atende a isto ^([a-z]+)\/([a-z]+)\/([0-9]+)$
logo ele vai reescrever, vai chamar teste.php?action=edit&model=user&id=1
outro
RewriteRule ^sitemap\.xml$ geraxml.php [NC,L]
se eu chamar (escrever na barra de endereço) meusite.com/sitemap.xml
o servidor vai reescrever a url e vai chamar meusite.com/geraxml.php
mais explicação aqui
http://wbruno.com.br/php/desmistificando-urls-amigaveis-com-php-e-htaccessapache/
e aqui
>
Electronic parte html/php que contém link é esse trecho:
<a href="<?php echo $value['slug'] ?>">ver</a>
desisto, terceira vez que eu to perguntado o html gerado e você esta mostrando o php :wacko:
>
como que o php vai saber que o 20 no final da url é um id se não tem a referencia id= que é o que $_GET['id'] esta buscando??
Se não colocar id=<id>, não tem jeito mesmo
Mas por que ID? Você não quer mostrar ID...
já me perdi de novo...
>
e como que ele o PHP vai saber http://meusite.com.br/slug-aqui que a segunda parte da url:
O PHP não sabe que a URL é meusite.com.br/slug-aqui. O PHP vê a URL rescrita pelo Servidor. Ou seja, o PHP vê meusite.com.br/posts.php?slug=slug-aqui
Por isso você usa $_GEt['slug']
O que o Electronic está pedindo é o html gerado. Execute o script e visualize o código-fonte
Finalmente consegui alguma coisa, mas ao invés de :
>
Porque você ta reescrevendo a url
RewriteRule ^([a-z]+)\/?$ posts.php?slug=$1 [NC,L]
só esta funcionando se obrigatoriamente eu colocar posts/ no inicio da regra
RewriteRule ^posts\/(.*)\/?$ posts.php?slug=$1 [NC,L]
RewriteRule ^contato/?$ /contato.php [NC,L]
vai certinho para a url amigavel: meusite.com.br/posts/slug-aqui
mas aparentemente o servidor esta entendendo como um diretorio, pois fica tudo desconfigurado, sem css e javascript.
Na pagina contato fica certinho quando acessado: meusite.com.br/contato
mas quando tento: meusite.com.br/contato/
Com a barra no final, vai pra url mas fica tudo sem css e javascript também
Sendo que coloquei /? no final das regras, deveria aceitar com ou sem /
Tentei removendo /? continuou do mesmo jeito.
Alguma ideia de como resolver?
resolvido com <?php echo BASE_URL; ?>/ nas urls no header e footer.
obrigada pela super paciência
>
Em 22/08/2015 at 18:24, Electronic disse:
Se na tabela esta salvo o slug entao o
WHERE slug=:slug vai encontrar o seu post mesmo sem o ID
quanto ao botão html já respondi:
nao, nao respondeu
eu perguntei como o link html ta ficando, você esta mostrando o PHP
Ola @Electronic Boa tarde
perdoa usar este post aqui sei que já tem tempo
mais estou quase o mesmo problema ai
porém
tenho titulo e id
quero tirar o id do final
antes estava assim: meusite/pasta/item/nome-de-algo/6
consegue fazer ficar assim meusite/pasta/nome-de-algo/6
Porém alguns dizem que deixa este numero no final atrapalha na parte de SEO
Então queria poder tirar este id do final deixa apenas o titulo como url entende?
Já tentei usar a sua explicação ai mais não tive resultado se puder me ajudar ficarei grato...
Meu Htaccess esta desta forma
DirectoryIndex index.php
ErrorDocument 404 https://meudominio.com/
#-------------------------------------------------------------------
Na minha tabela tem
ID | TITULO | TELEFONE | ETC...
1 Empresa1 3333333
2 Empresa 2 5555555
3 Empresa 3 666666
Na minha classe fiz assim
<?php
//URL DEBUG CHARACTERS
function encodeSEOString($string) {
$string = preg_replace("`\[.*\]`U", "", $string);
$string = preg_replace('`&(amp;)?#?[a-z0-9]+;`i', '-', $string);
$string = htmlentities($string, ENT_COMPAT, 'utf-8');
$string = preg_replace("`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);`i", "\\1", $string);
$string = preg_replace(array("`[^a-z0-9]`i", "`[-]+`"), "-", $string);
return strtolower(trim($string, '-'));
}
;
?>
No meu html que direciona aos post antes estava assim
<a href="./listagem/<?php echo $dados['id']; ?>-<?php echo encodeSEOString($dados['titulo']); ?>">Ver detalhes</a>
Agora esta assim
<a href="./<?php echo encodeSEOString($dados['titulo']); ?>-<?php echo $dados['id']; ?>">Ver detalhes</a>
Como eu disse logo em cima quero que ele abre agora só assim
<a href="./<?php echo encodeSEOString($dados['titulo']); ?>">Ver detalhes</a>
Desde ja fico grato ai se me ajudar...
Se você não quer passar o id então a busca do post vai ser pelo titulo certo??
você tem certeza que no futuro não vai ter post com nome igual, e se tiver não vai ter problema?
veja a url deste topico do iMaster:
forum.imasters.com.br/topic/540486-url-amigavel-usando-slug/ <- tem o id na url
se você realmente nao quer o ID, não há necessidade do paremetro id aqui
/posts.php?id=$2slug=$1
até pq nao existe o grupo 2,
entenda que o que esta dentro de "()" é um grupo e na sua expressão só existe um "()" grupo quem estará em $1
retire também a barra do começo
RewriteRule ^(.*)$ /posts.php?slug=$1 [NC,L]
faça o teste