Giihh 6 Denunciar post Postado Agosto 21, 2015 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
Electronic 124 Denunciar post Postado Agosto 22, 2015 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
Giihh 6 Denunciar post Postado Agosto 22, 2015 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
Electronic 124 Denunciar post Postado Agosto 22, 2015 nao Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 22, 2015 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. Compartilhar este post Link para o post Compartilhar em outros sites
Electronic 124 Denunciar post Postado Agosto 22, 2015 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
Giihh 6 Denunciar post Postado Agosto 22, 2015 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
Electronic 124 Denunciar post Postado Agosto 22, 2015 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
Giihh 6 Denunciar post Postado Agosto 22, 2015 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
Beraldo 864 Denunciar post Postado Agosto 22, 2015 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
Electronic 124 Denunciar post Postado Agosto 22, 2015 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
Giihh 6 Denunciar post Postado Agosto 23, 2015 "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
Electronic 124 Denunciar post Postado Agosto 23, 2015 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
Beraldo 864 Denunciar post Postado Agosto 23, 2015 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
Giihh 6 Denunciar post Postado Agosto 24, 2015 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
Giihh 6 Denunciar post Postado Agosto 24, 2015 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
Jack Oliveira 1 Denunciar post Postado Agosto 20, 2019 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