Ir para conteúdo

POWERED BY:

Arquivado

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

baldit

url amigável - HTACCESS

Recommended Posts

já estou prestes a desistir, já segui todos os tutoriais q encontrei e dicas dadas e simplesmente não dá certo, existe mais alguma coisa q tem q ser instalado/habilitado no servidor para que funcione?? já estou achando q o problema é com meu apache.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma lá amigo não diga isso!!

 

Vamos lá..

 

Fiz um exemplo simples aqui, você está usando wamp? ou qual? o rewriterule já está ativado? Se não, ative. Se sim, prossiga..

 

index.php

<?php

$page = $_GET["page"];

if($page == 'principal') {$include = 'principal.php';}
else if($page == 'noticia') {$include = 'noticia.php';}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<p>Aqui é a página base "index.php" Esse texto entra em todas as páginas, aproveite e coloque um menu, topo e outras coisas que vão ser padrões em todo o site.</p>
<p>Include para página abaixo:</p>
<p> </p>
<?php include($include); ?>
</body>
</html>

 

principal.php

Essa é a página principal

 

noticia.php

Principal que puxa outra página pelo GET:<br>
<br>


<?php
$page_id = $_GET["id"].".php";

include($page_id);

?>

 

hoje-e-dia-acaba.php

Notícia Exemplo!

 

Entendendo:

Bom os dados para abrir as páginas serão resgatados via GET, confira abaixo o .htaccess

 

.htaccess

RewriteEngine On

RewriteRule principal index.php?page=principal
RewriteRule ^([^/]*)/([^/]*)$ index.php?page=$1&id=$2

 

Linha #1: Ligou o rewrite..

 

Linha #3: Indica o GET page para principal se este for a requisição.

Linha #4: Rescreve a url: index.php?page=noticia&id=hoje-e-dia-acaba .. para: noticia/hoje-e-dia-acaba

 

Bom, é lógico é a forma que fiz para busca a notícia é um exemplo, você utilizará a página notícia por exemplo para recuperar o id ou alias da notícia e busca no banco de dados.

 

A página index é simples, ela simplesmente registra o GET da requisição da variável $page, e então define nos ifs a qual página tal variável pertence, dando assim o endereço de sua página, que é mostrada através do include.. Simples não?

 

Qualquer mão ou dúvida, retorne..

 

abraço.

 

Baixe o exemplo que fiz, e copie para qualquer pasta do seu servidor, e teste as duas url:

 

/seuservidor/pastaqueesta/principal

/seuservidor/pastaqueesta/noticia/hoje-e-dia-acaba

 

Link: http://www.criartevix.com.br/externo/imasters/amigavel.rar

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma lá amigo não diga isso!!

 

Vamos lá..

 

Fiz um exemplo simples aqui, você está usando wamp? ou qual? o rewriterule já está ativado? Se não, ative. Se sim, prossiga..

 

index.php

<?php

$page = $_GET["page"];

if($page == 'principal') {$include = 'principal.php';}
else if($page == 'noticia') {$include = 'noticia.php';}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<p>Aqui é a página base "index.php" Esse texto entra em todas as páginas, aproveite e coloque um menu, topo e outras coisas que vão ser padrões em todo o site.</p>
<p>Include para página abaixo:</p>
<p> </p>
<?php include($include); ?>
</body>
</html>

 

principal.php

Essa é a página principal

 

noticia.php

Principal que puxa outra página pelo GET:<br>
<br>


<?php
$page_id = $_GET["id"].".php";

include($page_id);

?>

 

hoje-e-dia-acaba.php

Notícia Exemplo!

 

Entendendo:

Bom os dados para abrir as páginas serão resgatados via GET, confira abaixo o .htaccess

 

.htaccess

RewriteEngine On

RewriteRule principal index.php?page=principal
RewriteRule ^([^/]*)/([^/]*)$ index.php?page=$1&id=$2

 

Linha #1: Ligou o rewrite..

 

Linha #3: Indica o GET page para principal se este for a requisição.

Linha #4: Rescreve a url: index.php?page=noticia&id=hoje-e-dia-acaba .. para: noticia/hoje-e-dia-acaba

 

Bom, é lógico é a forma que fiz para busca a notícia é um exemplo, você utilizará a página notícia por exemplo para recuperar o id ou alias da notícia e busca no banco de dados.

 

A página index é simples, ela simplesmente registra o GET da requisição da variável $page, e então define nos ifs a qual página tal variável pertence, dando assim o endereço de sua página, que é mostrada através do include.. Simples não?

 

Qualquer mão ou dúvida, retorne..

 

abraço.

 

Baixe o exemplo que fiz, e copie para qualquer pasta do seu servidor, e teste as duas url:

 

/seuservidor/pastaqueesta/principal

/seuservidor/pastaqueesta/noticia/hoje-e-dia-acaba

 

Link: http://www.criartevix.com.br/externo/imasters/amigavel.rar

 

Abraço

muito obrigado pela atenção, aqui de fato funciona quando digito esses links porém quando digito somente http://localhost/ é apresentado um erro informando que falta um parametro seria possível carregar a página principal sem digitar mais nada??

 

e no caso de carregar arquivos que estão em um subdiretório como fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que funcionou amigo.. veja abaixo..

 

quando digito somente http://localhost/ é apresentado um erro informando que falta um parametro seria possível carregar a página principal sem digitar mais nada??

 

Amigo apenas modifique as primeiras linhas do index.php

 

de:

$page = $_GET["page"];

if($page == 'principal') {$include = 'principal.php';}

 

Para:

$page = @$_GET["page"];

if($page == 'principal' || empty($page)) {$include = 'principal.php';}

 

e no caso de carregar arquivos que estão em um subdiretório como fazer?

 

Para cada diretório que você tiver alguma página, coloque dentro do diretório o seguinte arquivo:

 

.htaccess

RewriteEngine off

 

Qualquer coisa reporte.. rss

 

Abraço..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que funcionou amigo.. veja abaixo..

 

 

 

Amigo apenas modifique as primeiras linhas do index.php

 

de:

$page = $_GET["page"];

if($page == 'principal') {$include = 'principal.php';}

 

Para:

$page = @$_GET["page"];

if($page == 'principal' || empty($page)) {$include = 'principal.php';}

 

 

 

Para cada diretório que você tiver alguma página, coloque dentro do diretório o seguinte arquivo:

 

.htaccess

RewriteEngine off

 

Qualquer coisa reporte.. rss

 

Abraço..

 

cara uma das poucas pessoas q me fizeram entender um pouco sobre esse assunto foi você, a partir da sua ajuda juntei as informações e aos poucos estou avançando, adaptei o seguinte código no index.php:

 

<?php
$pasta = @$_GET["pasta"];
$arquivo = @$_GET["arquivo"];
$idantes = @$_GET["idantes"];

if($pasta == 'home' || empty($pasta)) {$include = 'home.php';}

elseif(file_exists("$pasta/$arquivo.php/$idantes")){

               //Se o arquivo n for um diretorio inclui do contrario da erro
               is_file("$pasta/$arquivo.php") ? $include = "$pasta/$arquivo.php" : $include = "$pasta/$arquivo/$idantes.php";

               //Verifica se o arquivo existe
       }elseif($pasta == "" && $arquivo == ""){

                       //Se o arquivo n for um diretorio inclui do contrario da erro
                       include_once((is_file("$pasta.php")) ? "$pasta.php" : "$include = home.php");

               }else{

                       //Do contrario mosta a pagina de erro
                       include_once($include = '404.php');
}
?>
<?php include($include); ?>

 

e o .htaccess:

 

RewriteEngine On

RewriteRule home index.php?pasta=home
RewriteRule ^([^/]*)/([^/]*)$ index.php?pasta=$1&arquivo=$2&idantes=$3

 

em partes isso deu certo, pq quando digito "localhost/noticias/ler" ele acessa o arquivo ler.php direitinho porém quando insiro o terceito parametro $idantes ele dá arquivo não encontrado, o q pode estar errado??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia meu brother.. que bom que estamos progredindo..

 

Sinceramente não saquei ainda sua real intenção, porém compreendi um pouco segue modificações com base em seu código.

 

index.php

<?php
$pasta = @$_GET["pasta"];
$arquivo = @$_GET["arquivo"];

if($pasta == 'home' || empty($pasta)) {$include = 'home.php';}

elseif(file_exists("$pasta/$arquivo.php")){

               //Se o arquivo n for um diretorio inclui do contrario da erro
               is_file("$pasta/$arquivo.php") ? $include = "$pasta/$arquivo.php" : $include = "$pasta/$arquivo";

               //Verifica se o arquivo existe
       }elseif($pasta == "" && $arquivo == ""){

                       //Se o arquivo n for um diretorio inclui do contrario da erro
                       include_once((is_file("$pasta.php")) ? "$pasta.php" : "$include = home.php");

               }else{

                       //Do contrario mosta a pagina de erro
                       include_once($include = '404.php');
}
?>
<?php include($include); ?>

 

Comentários do index.php

Você estava tentando recuperar o get "idantes" nesta página para usar no ler.php? se sim, fez errado. Recupere o get no ler.php. Veja abaixo:

 

ler.php

teste

<?php

echo $_GET["idantes"];

?>

 

Agora da uma sacada no .htaccess .. aqui está o segredo.. der repente pode te ajudar no script que você está tentando fazer.

 

.htaccess

RewriteEngine On

RewriteRule home index.php?pasta=home
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?pasta=$1&arquivo=$2&idantes=$3

 

Percebe a alteração? Veja que você atribuiu um novo parâmetro na url, sendo assim o htacces tem de acompanhar.. veja como o servidor interpreta:

 

Isso é uma regra, escreva "$1valor/$2valor/$3valor" com base na url: index.php?pasta=$1&arquivo=$2&idantes=$3

 

Ou seja, se você quiser adicionar um novo parâmetro segue a mesma lógica que você começou, você só esqueceu de adicionar na regra a esquerda..

 

RewriteEngine On

RewriteRule home index.php?pasta=home
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?pasta=$1&arquivo=$2&idantes=$3&antigas=$4

Por exemplo...

 

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso me ajudou muito, principalmente a parte do .htaccess.

 

deixa eu te explicar qual a estrutura do meu projeto talvez assim você entenda:

 

index.php

home.php

/admin

/img

/css

/noticias

index.php

ler.php

/css

/layout

/entretenimento

index.php

ler.php

/css

/layout

 

não sei se ficou claro, mas vou explicar: no index (meusite.com) haverão links que direcionarão por exemplo para uma notícia e de acordo com a categoria dessa notícia ela será aberta em um ler.php diferente com um design diferente e cada categoria tem um index.php também q exibirá somente as notícias daquela categoria também com um layout diferente. Está bagunçado???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora eu entendi meu brother..

 

Pois bem, porque não coloca tudo na mesma página noticias.php ? Para alterar o layout faz assim..

 

Na página noticia coloca um if, que dependendo da categoria seleciona uma página especifica.. ex:

 

Dentro da pasta noticias (ou nem precisa de pasta), tem uma outra pasta: "layout/"

que terá os arquivos:

 

entretenimento.php

diversas.php

mudiais.php

brasil.php

 

Então, sabendo que cada uma destas pastas terão suas respectivas categorias, usamos o if para indicarmos qual página puxar.. nos meus projetos joomla, uso direto isso.. ex.

 

 

index.php

<?php
$pasta = @$_GET["pasta"];
$arquivo = @$_GET["arquivo"];

if($pasta == 'home' || empty($pasta)) {$include = 'home.php';}

elseif($pasta == 'noticias'){$include = "noticias.php";}

?>
<?php include($include); ?>

 

noticias.php

<?php

$categoria = $_GET["arquivo"];
// de acordo com a categoria puxa a respectiva página
if($categoria == 'entretenimento') {$layout = "layout/entretenimento.php";}
elseif($categoria == 'diversas') {$layout = "layout/diversas.php";}
elseif($categoria == 'mundiais') {$layout = "layout/mundiais.php";}
elseif($categoria == 'brasil') {$layout = "layout/brasil.php";}

else {$layout = "layout/padrao.php";} // caso a categoria não tenha uma página específica

include($layout); // mostra o layout da categoria

?>

 

layout/entretenimento.php

<?php

$id = $_GET["idantes"];

// aqui vai codigo para busca noticia através do id e as opções de página do entretenimento

?>

 

 

Ou, se os layouts para as páginas forem iguais e só mudarem as cores, o melhor é fazer um layout padrão e só alterar entre os estilos... ex..

 

noticias.php

<?php

$categoria = $_GET["arquivo"];
// de acordo com a categoria puxa a respectiva css
if($categoria == 'entretenimento') {$layout = "layout/entretenimento.css";}
elseif($categoria == 'diversas') {$layout = "layout/diversas.css";}
elseif($categoria == 'mundiais') {$layout = "layout/mundiais.css";}
elseif($categoria == 'brasil') {$layout = "layout/brasil.css";}

else {$layout = "layout/padrao.css";} // caso a categoria não tenha uma página específica

?>
<link rel="stylesheet" href="<?php echo $layout;?>" type="text/css" media="screen" />

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

estava pensando exatamente sobre isso ontem antes de ler sua postagem e já estava montando em minha cabeça uma forma de retirar o diretório da url e assim diminuir o tamanho dela então fiz o seguinte:

 

ler.php:

 

<?php require('/admin/noticiasbd.php'); ?>
<?php
$arquivo = @$_GET[arquivo];
$idantes = @$_GET[idantes];
$id = addslashes($idantes);
$sql = "SELECT id, titulo, resumo, noticia, categoria, imagem, data, keywords FROM $tabela WHERE ver = '1' AND id = '$id'";
$resultado = mysql_query($sql)
or die ("Não foi possível realizar a consulta ao banco de dados");
while ($linha=mysql_fetch_array($resultado)) {
$id= $linha["id"];
$titulo= $linha["titulo"];
$resumo= $linha["resumo"];
$noticia= $linha["noticia"];
$data= $linha["data"];
$imagem= $linha["imagem"];
$keywords= $linha["keywords"];
$categoria = $linha["categoria"];
include($categoria."ler.php");
?>

 

assim ele carrega o arquivo com o nome categorialer.php (por exemplo noticiasler.php) em que eu encerro o whille montando a página e carregando o .css, certo??

no htaccess quero editá-lo para aceitar o título como primeiro parâmetro, mas acredito q ele não seja a melhor opção para usar no select no banco de dados então passaria o idantes também e então a url ficaria assim meusite.com/titulo/arquivo/id, essa é a melhor opção? o q deveria ser mudado no htaccess??

Compartilhar este post


Link para o post
Compartilhar em outros sites
essa é a melhor opção?

 

Tudo depende de como será o layout das categorias, o que vai mudar por exemplo de layout para layout? Disposição dos elementos? Cores? Colunas?

 

Se somente for cores, não é preciso criar uma página para cada categoria, somente alterar o css, de acordo com a categoria vinda pelo get da url. Então você teria somente uma página para mostrar as notícias, porém mudaria cores e outras coisas pelo css.

 

para aceitar o título como primeiro parâmetro, mas acredito q ele não seja a melhor opção para usar no select no banco de dados

 

Correto, sem contar que você teria uma dor de cabeça enorme, pois um título:

 

Assim:

Notícia Teste com Espaço e Acentuação.

 

A URL lê, assim:

Not%C3%ADcia%20Teste%20com%20Espa%C3%A7o%20e%20Acentua%C3%A7%C3%A3o.

A não ser que tenha um alias para cada notícia. Por ex:

noticia-teste-com-espaco-e-acentuacao .. Isso definido já no banco de dados.

 

Veja direitinho o exemplo que te passei, ainda acho ser o mais indicado, porém, responda as perguntas do início..

o que vai mudar por exemplo de layout para layout? Disposição dos elementos? Cores? Colunas?

 

Para lhe ajudarmos melhor..

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

haverão algumas partes do layout q serão diferentes além do css, por isso quero chamar arquivos diferentes.

 

Fiz uns testes aqui e está funcionando, porém ainda não encontrei uma forma de na minha home e futuramente no sitemap inserir o título na url para fins de optimização SEO e ficar como você postou "noticia-teste-com-espaco-e-acentuacao", mas quando digito http://localhost/titulo/ler/15 dá tudo certo e a página ler é carregada e carrega a página "ler".$categoria.".php"

Compartilhar este post


Link para o post
Compartilhar em outros sites

depois de muito pesquisar encontrei essa função:

 

<?php
function remover($str, $enc = "UTF-8"){

$acentos = array(
'A' => '/À|Á|Â|Ã|Ä|Å/',
'a' => '/à|á|â|ã|ä|å/',
'C' => '/Ç/',
'c' => '/ç/',
'E' => '/È|É|Ê|Ë/',
'e' => '/è|é|ê|ë/',
'I' => '/Ì|Í|Î|Ï/',
'i' => '/ì|í|î|ï/',
'N' => '/Ñ/',
'n' => '/ñ/',
'O' => '/Ò|Ó|Ô|Õ|Ö/',
'o' => '/ò|ó|ô|õ|ö/',
'U' => '/Ù|Ú|Û|Ü/',
'u' => '/ù|ú|û|ü/',
'Y' => '/Ý/',
'y' => '/ý|ÿ/',
'a.' => '/ª/',
'o.' => '/º/');

  return preg_replace($acentos,
                      array_keys($acentos),
                      htmlentities($str,ENT_NOQUOTES, $enc));
}
?>

mas pelo q percebi ela não faz a mudança do espaço vazio pelo "-" e também não sei como e onde colocar essa função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom adaptei o código de uma forma porca más adaptei para você tentar trabalhar com ele...

 

<?php
function remover($str, $enc = "UTF-8"){

$acentos = array(
'-' => '/ /',
'a' => '/À|Á|Â|Ã|Ä|Å|à|á|â|ã|ä|å|A/',
'b' => '/B/',
'c' => '/Ç|ç|C/',
'd' => '/D/',
'e' => '/È|É|Ê|Ë|è|é|ê|ë|E/',
'f' => '/F/',
'g' => '/G/',
'h' => '/H/',
'i' => '/Ì|Í|Î|Ï|ì|í|î|ï|I/',
'j' => '/J/',
'k' => '/K/',
'l' => '/L/',
'm' => '/M/',
'n' => '/Ñ|ñ|N/',
'o' => '/Ò|Ó|Ô|Õ|Ö|ò|ó|ô|õ|ö|O/',
'p' => '/P/',
'q' => '/Q/',
'r' => '/R/',
's' => '/S/',
't' => '/T/',
'u' => '/Ù|Ú|Û|Ü|ù|ú|û|ü|U/',
'v' => '/V/',
'w' => '/W/',
'x' => '/X/',
'y' => '/Ý|ý|ÿ|Y/',
'z' => '/Z/',
'a.' => '/ª/',
'o.' => '/º/');

  return preg_replace($acentos,
                      array_keys($acentos),
                      htmlentities($str,ENT_NOQUOTES, $enc));
}


$titulo = "Os grandes Cabelos da Rapunzel é Azul";

echo remover($titulo);
// ou coloque em uma váriavel: $variavel = remover($titulo);

?>

 

Onde $titulo é no caso o seu título (Oh, Sério? Não diga..), que você poderá buscar do banco ou da cadeira como preferir, e trabalhar com seu retorno, colocando em uma variável ou não, para fazer o que quiser com ela..

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites
valeu pela auda mas aqui a página retorna em branco quando tento testar o código.

 

Aqui funcionou perfeitamente, tente testar somente o código que lhe passei acima em uma nova página.

 

Estranho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vai entender, até a hora do almoço não carregava agora a tarte funcionou, só não substitui as virgulas e interrogações isso pode ser ruim???

 

ababei decidindo por subsituir as virgulas e as ?, para isso acrescentei essas duas linhas:

 

'' => '/,/',
'' => '/[+?]/',

 

o mais difícil foi substituir a interrogação pq eu gastei várias horas procurando a forma correta e depois de vários artigos lidos achei um em q indicava para colocar entre colchetes e com o +. A função ficou assim:

 

<?php
function remover($str, $enc = "iso-8859-1"){
$acentos = array(
'' => '/,|[+?]/',
'-' => '/ /',
'a' => '/À|Á|Â|Ã|Ä|Å|à|á|â|ã|ä|å|A/',
'b' => '/B/',
'c' => '/Ç|ç|C/',
'd' => '/D/',
'e' => '/È|É|Ê|Ë|è|é|ê|ë|E/',
'f' => '/F/',
'g' => '/G/',
'h' => '/H/',
'i' => '/Ì|Í|Î|Ï|ì|í|î|ï|I/',
'j' => '/J/',
'k' => '/K/',
'l' => '/L/',
'm' => '/M/',
'n' => '/Ñ|ñ|N/',
'o' => '/Ò|Ó|Ô|Õ|Ö|ò|ó|ô|õ|ö|O/',
'p' => '/P/',
'q' => '/Q/',
'r' => '/R/',
's' => '/S/',
't' => '/T/',
'u' => '/Ù|Ú|Û|Ü|ù|ú|û|ü|U/',
'v' => '/V/',
'w' => '/W/',
'x' => '/X/',
'y' => '/Ý|ý|ÿ|Y/',
'z' => '/Z/',
'a.' => '/ª/',
'o.' => '/º/');

  return preg_replace($acentos, array_keys($acentos), htmlentities($str,ENT_NOQUOTES, $enc));
}
?>

 

------------------------------

 

estou de volta, incrementei no meu .htaccess uma linha para remover o www. da url aí ele ficou assim:

 

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule (.*) http://%1/$1 [R=301,L]
RewriteRule home index.php?titulo=home
RewriteRule news index.php?titulo=news
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?titulo=$1&arquivo=$2&idantes=$3

 

uma outra dúvida q tenho é: como evitar conteúdo duplicado?? pq notei q se eu digitar localhost/home.php e localhost/home ou só localhost ele abre o conteúdo e gostaria q ficasse apenas localhost, é possível?

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.