Ir para conteúdo
Giihh

URL amigavel usando slug

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

  • +1 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas no botão

<a href="<?php echo $value['slug'] ?>" >Ver</a>

precisa colocar slug= ??

 

<a href="<?php echo slug=<?php echo $value['slug'] ?>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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??

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

"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=

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

http://www.google.com.br

 

 

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:

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 


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

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

resolvido com <?php echo BASE_URL; ?>/ nas urls no header e footer.

 

obrigada pela super paciência

Compartilhar este post


Link para o post
Compartilhar em outros sites
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/
#-------------------------------------------------------------------
# PERMISSIONANDO REESCRITA
#-------------------------------------------------------------------
RewriteEngine On    # Turn on the rewriting engine
# not rewrite css, js and images
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpg|gif|png)$ [NC]
RewriteRule ^([0-9A-z_-]+)\/([0-9A-z_-]+)$ job_detalhes.php?nome=$1&id=$2[QSA,L,NC]

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

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