Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

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

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

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.

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

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:

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

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

×

Informação importante

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