Ir para conteúdo

POWERED BY:

Arquivado

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

Tylër

[Resolvido] Problemas com URLs amigáveis

Recommended Posts

Boa tarde,

 

Estou com um problemão com as urls amigáveis, sendo que já tentei várias configurações e não obtive o resultado específico a minha particularidade.

 

Bom, vamos ao problema:

 

Meu site: http://localhost/ possui sempre 2 parâmetros:

 

http://localhost/index?param=noticias&title=Titulo-da-noticia

e/ou

 

http://localhost/index?param=destaques&title=Titulo-do-destaque

Bom, gostaria que os parâmetros fossem reescritos para:

 

http://localhost/noticias/Titulo-da-noticia

e

 

http://localhost/destaques/Titulo-do-destaque

* Utilizo switch/case para organizar o site.

 

Como proceder?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se este tópico não fosse tão antigo(de 2008) eu postaria nele, mas para não revivê-lo vou citar meu problema aqui:

 

Bom, nenhum destes métodos deram certo comigo.

 

Tenho uma página index (sem extensão no .htaccess) onde possui switch/case:

 

<?php
        switch($param) {
           case "slideshow": // mesmo que news.php
               include("news.php");
               break;
           case "news":  // news.php
               include("news.php");
               break;
           case "history":
               include("history.php");
               break;
           case "contact":
               include("contact.php");
               break;
           default:
               include("home.php");
        }
     ?>

 

No trecho:

case "slideshow": // mesmo que news.php, só que utilizará o if(isset($_GET['slideshow'])) ...
               include("news.php");
               break;
           case "news":  // news.php
               include("news.php");
               break;
Não dá pra utilizar isso de incluir os arquivos de acordo com o parâmetro, pois tenho vários tratamentos na mesma página, de acordo com o switch/case

 

Um teste que realizei foi:

 

Deixar de acessar:

 

http://localhost/index?param=slideshow&title=Reuniao-dos-grupos-teatrais

e passar a testar com a URL:

 

http://localhost/slideshow/Reuniao-da-Agrutevaje-e-grupos-teatrais

Configurei no .htaccess assim:

# URLs amigaveis
#RewriteEngine On
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^(!.(\.gif|\.jpg|\.png|\.css|\.js|\.txt|\.php|\.htm|\.html)|.+[^/])$ /$1/ [L]
#RewriteRule ^([^-]+)/$ /index.php?param=$1&title=$2

Mas ao acessar a url amigável, todo o conteúdo que está em frames recebe o mesmo conteúdo da index.php e o conteúdo que deveria ser pêgo do switch/case fica em branco...

Compartilhar este post


Link para o post
Compartilhar em outros sites

.htaccess

RewriteEngine On
RewriteBase /

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule (noticias|destaques)\/([^\/]+) index.php?param=$1&title=$2 [QSA]

index.php

<?php
if ( isset( $_GET[ 'param' ] ) && isset( $_GET[ 'title' ] ) ){
$param = filter_var( $_GET[ 'param' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );
$title = filter_var( $_GET[ 'title' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );

switch ( $param ){
	case 'destaques':
		echo 'Destaques foi chamado';
		break;
	case 'noticias':
	default:
		echo 'Noticias foi chamado';
}
} else {
header( sprintf( '%s 400 Bad Request' , $_SERVER[ 'SERVER_PROTOCOL' ] ) );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

.htaccess

RewriteEngine On
RewriteBase /

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule (noticias|destaques)\/([^\/]+) index.php?param=$1&title=$2 [QSA]

index.php

 <?php if ( isset( $_GET[ 'param' ] ) && isset( $_GET[ 'title' ] ) ){ 	$param = filter_var( $_GET[ 'param' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW ); 	$title = filter_var( $_GET[ 'title' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW ); 	switch ( $param ){ 		case 'destaques': 			echo 'Destaques foi chamado'; 			break; 		case 'noticias': 		default: 			echo 'Noticias foi chamado'; 	} } else { 	header( sprintf( '%s 400 Bad Request' , $_SERVER[ 'SERVER_PROTOCOL' ] ) ); } 

 

Perfeito!

 

Não sabia que teria que indicar os parâmetros "noticias" e "destaques" no .htaccess, obrigado! :D

 

 

Mas agora que vem o verdadeiro problema que não sei resolver realmente...

 

http://localhost/new...upos-Fundadores (esta foi a url que consegui fazer funcionar, graças a você, mas...

 

Na index.php o centro fica vazio, sendo que no switch/case está para mostrar

a pagina home.php como default.... oO

 

Imagem Postada

 

 

 

A url: http://localhost/?param=news ficou assim:

 

Imagem Postada

 

 

 

A url http://localhost/?pa...title=Grupos... ficou assim

 

Imagem Postada

 

 

 

Mas o pior de tudo ainda há por vir, que em todas as configurações do .htaccess ficava assim,

eu não entendo, já que não tem nada pra ser incluído neste lugar,,.... afz

Os mesmos menus da esquerda da página aparecem na parte inferior direita oO

Qual o motivo disto acontecer?

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, estão todos com "/templates/" ...

 

O que não entendo é pq através da url: "http://localhost/" o centro da pagina fica em branco, sendo que se não tivesse nenhum parametro era para mostrar a home.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

@kakaroto

 

você queria ver mais detalhes, bom agora tenho aqui muitos detalhes

 

A url: tananettabeleza.com.br é o site

 

Este é o arquivo .htaccess sugerido neste tópico pelo João Batista Neto:

 

RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule (inicio|artigo)\/([^\/]+) index.php?param=$1&artigo=$2 [QSA]

Este é o arquivo articles_center.php

if ( isset( $_GET[ 'param' ] ) || isset( $_GET[ 'artigo' ] ) )
	{
 	
 	switch($param)
 	{
 	case 'contato':
 	include("contact.php");
 	break;
 	case 'cadastro':
 	include("register.php");
 	break;
 	case 'anunciantes':
 	include("advertisers.php");
 	break;
 	case 'dicas':
 	include("info.php");
 	break;
 	case 'ranking':
 	include("ranking.php");
 	break;
 	case 'anuncie':
 	include("advertise.php");
 	break;
 	default:
 	include("home.php");
 	}
	} else {
 	header( sprintf('%s 400 Bad Request' , $_SERVER['SERVER_PROTOCOL']) );
	}

} else {
	include("home.php");
}

Este é o arquivo list_param.php incluído no diretorio configuracoes

<?php

// lista de parametros para url amigaveis

$param = filter_var( $_GET[ 'param' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );
$article = filter_var( $_GET[ 'artigo' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );
$type = filter_var( $_GET[ 'type' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );

?>

E lá no site tem a seguinte url para um artigo:

 

http://tananettabeleza.com.br/index?param=inicio&artigo=1501742950505608418610532969955841184371808956274781355960042520576

 

Gostaria de deixá-la assim:

 

http://tananettabeleza.com.br/inicio/1501742950505608418610532969955841184371808956274781355960042520576

Mas o site até aparece só que depois ele fica redirecionando sem fim ~~

 

E quando isso não acontece, ocorre o mesmo problema do anterior que era a inclusão automática dos menus da esquerda do site, afz

Este problema eu não entendo...

 

 

Bom, é este o problema.

Penso eu que se resolver este, resolvo o anterior, já que são parecidos...

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara eu vou montar um code para tu e tu segue essa logica minha

porque senao eu piro aqui

 

 

Este é o arquivo articles_center.php

esse arquivo vai ter ferrar no futuro

imagine você com um site de 5o paginas ai eu você pirar legal

 

desculpe a demora e que eu nao recebi o aviso aqui :)

 

minha curiosidade esse numero e um id de titulo

 

1501742950505608418610532969955841184371808956274781355960042520576

// nao vai me disse que um id de um titulo :)

 

um abraço e boa pascoa

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara eu vou montar um code para tu e tu segue essa logica minha

porque senao eu piro aqui

 

 

Este é o arquivo articles_center.php

esse arquivo vai ter ferrar no futuro

imagine você com um site de 5o paginas ai eu você pirar legal

 

desculpe a demora e que eu nao recebi o aviso aqui :)

 

minha curiosidade esse numero e um id de titulo

 

 1501742950505608418610532969955841184371808956274781355960042520576 // nao vai me disse que um id de um titulo :) 

 

um abraço e boa pascoa

 

É sim, é a id sim, mas claro que vou mudar, isso foi só no começo.

 

Se eu conseguir fazer as urls amigáveis funcionarem no servidor, então a ir será o título separado por "-"

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola meu velho eu montei um code manero para você :)

 

essa aqui e minha index.php


<?
$url="http://localhost/amigavel";
?>
<HTML>
<HEAD>
<TITLE><?=$_GET["title"]?></TITLE>
</HEAD>

<BODY>
 <img src="'<?=$url?>'/imagem/sua.imagem.jpg"/>
<?

require_once 'articles_center.php';

?>

</BODY>
</HTML>

 

 

articles_center.php


<?
 if ($_GET['param'] ||  $_GET['title'])

 // se a variavel get param existe e a get title tambem


       {

       extract($_GET);
        //
      //$param=$_GET['param'];
       //article=$_GET["title"];
        // pegar os get e criar uma variavel:)
        $param=mysql_escape_string($param);
         $title=mysql_escape_string($title);
 //  mysql_escape_string    como você esta usando get e vai conectar ao banco

        if(file_exists('include/'.$param.'.php')){

       /// se o arquivo do meu get existe eu chamo ele

     //no seu  você nao fazia uma checagem interna

     // vou nem entrar em detalhe o cara podia  explodir seu site internamnte com aquele switch que você usou :)

        require_once('include/'.$param.'.php');

         }


   else {

     require_once('include/404.php');

   }



}

else {


require_once('include/home.php');

}

?>


 

 

meu htacess


#Habilita o modulo Rewrite
RewriteEngine On

#Indica qual é a pasta base de todo o conteudo
#RewriteBase /amigavel/

#Verifica se a url digitada é um arquivo caso seja para aqui
RewriteCond %{REQUEST_FILENAME} !-f

#Verifica se a url digitada é uma pasta caso seja para aqui
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^index\/([a-z0-9_-]+)\/?([a-z0-9_-]+)\/?$ index.php?param=$1&title=$2
RewriteRule ^index\/?$ index.php

 

e nao esqueça de criar uma pasta include que e aonde faz esta a inclusao dos arquivos :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola meu velho eu montei um code manero para você :)

 

essa aqui e minha index.php

 <? $url="http-~~-//localhost/amigavel"; ?> <HTML> <HEAD> <TITLE><?=$_GET["title"]?></TITLE> </HEAD> <BODY> <img src="'<?=$url?>'/imagem/sua.imagem.jpg"/> <? require_once 'articles_center.php'; ?> </BODY> </HTML> 

 

 

articles_center.php

 <? if ($_GET['param'] || $_GET['title']) // se a variavel get param existe e a get title tambem { extract($_GET); // //$param=$_GET['param']; //article=$_GET["title"]; // pegar os get e criar uma variavel:) $param=mysql_escape_string($param); $title=mysql_escape_string($title); // mysql_escape_string como você esta usando get e vai conectar ao banco if(file_exists('include/'.$param.'.php')){ /// se o arquivo do meu get existe eu chamo ele //no seu você nao fazia uma checagem interna // vou nem entrar em detalhe o cara podia explodir seu site internamnte com aquele switch que você usou :) require_once('include/'.$param.'.php'); } else { require_once('include/404.php'); } } else { require_once('include/home.php'); } ?> 

 

 

meu htacess

 #Habilita o modulo Rewrite RewriteEngine On #Indica qual é a pasta base de todo o conteudo #RewriteBase /amigavel/ #Verifica se a url digitada é um arquivo caso seja para aqui RewriteCond %{REQUEST_FILENAME} !-f #Verifica se a url digitada é uma pasta caso seja para aqui RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^index\/([a-z0-9_-]+)\/?([a-z0-9_-]+)\/?$ index.php?param=$1&title=$2 RewriteRule ^index\/?$ index.php 

 

e nao esqueça de criar uma pasta include que e aonde faz esta a inclusao dos arquivos :)

 

 

Só tá caindo na página não encontrada, não entendo, sendo que só digitei o parãmetro ?param=home, e eu tenho a pagina home.php no mesmo diretorio que a 404.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

dentro da pasta include e claro :)

outra coisa olha os comentario no meu codigo

 


if ($_GET['param'] ||  $_GET['title'])

 // se a variavel get param existe e a get title tambem


       {

       extract($_GET);
        //
      //$param=$_GET['param'];
       //article=$_GET["title"];
        // pegar os get e criar uma variavel:)
        $param=mysql_escape_string($param);
         $title=mysql_escape_string($title);
 //  mysql_escape_string    como você esta usando get e vai conectar ao banco

        if(file_exists('include/'.$param.'.php')){

       /// se o arquivo do meu get existe eu chamo ele

     //no seu  você nao fazia uma checagem interna

     // vou nem entrar em detale o cara podia  explodir seu site internamnte :)

        require_once('include/'.$param.'.php');

         }

 

eu so entro aqui

se você passar um titulo e o param sacou :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

crie dentro da index

 

um link assim

 

 <a href="/amigavel/index/servico/titulo">pagina servico</a> 

 

 

nao esqueça eu montei esse script dentro de uma pasta maior chamada amigavel :)

 

Sim, eu me lembro, só que como você viu lá no site, não tem pasta nenhuma, é direto no classpath, por isso que o exemplo do joao batista se encaixaria melhor.

 

Bom, em meu projeto, tenho a index.php,

 

a articles_center.php, onde mostrará a condição com switch/case

a home.php que é para lista de artigos (é a primeira pagina do site)

e dentro da home tem a condição: se um artigo foi selecionado, então mostra este artigo (é muito simples!)

 

Mas tem um problema, utilizando as configurações:

 

htaccess:

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?param=$1&article=$2

A url:

http://localhost/home&article=15017429505056084
Mostrará a lista de artigos normalmente

 

A url:

http://localhost/home&article=15017429505056084

Mostra o artigo normalmente, mas se eu tentar assim:

http://localhost/inicio/15017429505056084
Mostra o artigo e depois fica redirecionando, sem contar que na parte inferior direita da página, há uma inclusão do menu da esquerda novamente, credo!... oO

 

Agora as páginas:

 

index.php

<?php require_once("articles_center.php"); ?>

articles_center.php

if ( $_GET['param'] || $_GET['article'] )
	{
 	$param = explode('/', $_GET['param']);
 	switch($param[0])
 	{
 	case 'contato':
 	include("contact.php");
 	break;
 	case 'cadastro':
 	include("register.php");
 	break;
 	case 'anunciantes':
 	include("advertisers.php");
 	break;
 	case 'dicas':
 	include("info.php");
 	break;
 	case 'ranking':
 	include("ranking.php");
 	break;
 	case 'anuncie':
 	include("advertise.php");
 	break;
 	default:
 	include("home.php");
 	}
 	
	} else {
 	require_once("home.php");
	}

Não ia adiantar realizar os teste com if/else que você bolou, pois os parâmetros são

em português e as páginas em inglês e/ou possuem alguns números seguidos dos nomes delas, por segurança

 

 

home.php

<?php
if(isset($_GET['article'])) // se o parametro "artigo" existe...
{
	// visualizando artigo individual
	$sql = mysql_query("SELECT * FROM articles WHERE id='$param[1]'");
	if($sql) {
 	if(mysql_num_rows($sql)==0) {
 	echo "<h2>Informações</h2><p align=\"justify\">Este tópico não existe!</p>";
 	echo "$img_home <a href=\"index\" class=\"azul\">Ir para o início</a>";
 	} else {... mostra lista de artigos.... (aqui funciona perfeitamente e sem inclusão estranha do menu novamente)...

 

Visualização:

 

http://i60.servimg.com/u/f60/11/80/81/44/image10.jpg (a imagem eh grande)

Compartilhar este post


Link para o post
Compartilhar em outros sites

seria a mesma jogada

 

no seu caso o que eu procuro no meu e a index no seu case e a home

 

entao fica assim entao

 



RewriteRule ^home\/([a-z0-9_-]+)\/?([a-z0-9_-]+)\/?$ index.php?param=$1&title=$2

           home/  qualquerdado/ qualquer dado/      pagina que direciomar o que passar so isso    

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas ao incluir esta linha no .htaccess não acontece nada

 

RewriteRule ^home\/([a-z0-9_-]+)\/?([a-z0-9_-]+)\/?$ index.php?param=$1&title=$2
Estou por dentro do que ela faz, mas o ruim é que sempre eu teria que incluir /home na url, e não quero isso, mas sim apenas os parâmetros correspondente que poderão mudar de acordo com a página, exemplo:

 

 

http://localhost/ página principal

 

http://localhost/inicio/6464654654 para um artigo específico

 

http://localhost/contact para contato

 

http://localhost/validate/register para token para registro

 

etc

 

Então se eu incluísse esta linha aí, teria que ser:

 

http://localhost/home/ página principal

 

http://localhost/hom...icio/6464654654 para um artigo específico

 

http://localhost/home/contact para contato

 

http://localhost/hom...lidate/register para token para registro

 

Não é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

meu velho me adicionar no gtalk

 

pq eu passei o dia fora

 

pq eu nao fico no msn durante o dia

 

e melhor via gtalk

 

tu me mandar um email eu te ajudo no gtlak

 

por eu acho que isso vai virar um postagem gigante

 

 

kakaroto1500@gmail.com

 

tu me mandar um email a hora que você esta online ai a gente ver isso junto e resolver esse seu case logo :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado kakaroto!!! :D

 

Rapidinho você resolveu!

 

 

Bom, problema resolvido, isto é, no servidor, tivemos que trocar de servidor, não utilizamos mais apache, agora é Nginx, e as configurações não são em .htaccess mas sim, pelo nosso sistema lá, afz, é bem mais difícil configurar agora....

 

Mas em meu windows, só tá pegando o primeiro parâmetro do .htacess, o segundo é retornado de maneira vazia.

 

Imagem Postada

 

Segue o código PHP abaixo:

<?php
// pegando parametros para o sites
$page = filter_var( @$_GET[ 'page' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );
$id = filter_var( @$_GET[ 'id' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );

if( isset($_GET['page']) || isset($_GET['id']) )
{
	
	switch($page) {
 	case 'home':
 	$description_site = 'Início e id: '.$id;
 	break;
 	default:
 	$description_site = 'Esta página não existe!';
	}
	
}
else
{
	$description_site = 'De Medina para o mundo!';
}

?>

.htacess

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ([^\/]+) index.php?page=$1&id=$2 [QSA]
#RewriteRule ^(.php)$ index.php?page=$1&id=$2

 

Desta maneira, quase tudo funciona corretamente, exceto que o valor de "id" é sempre vazio, não é capturado...

Será que é problema de usar apache no windows?

 

Fiz uma instalação manual, depois mudei pra wampserver, depois pra appserv mas nada resolveu.....

 

 

As configurações do arquivo .httpd.conf são estas:

<Directory />
	Options FollowSymLinks Indexes
	AllowOverride All
</Directory>

Se eu mudar AllowOverride para AuthConfig, o servidor sai do ar....

Nos logs de erro, informam que as condições de rewrite não podem ser inclusas, então não entendo o que há de errado oO

 

Gostaria de uma ajuda pra fazer o apache lhe dar bem com .htacess.....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora sim, resolvido! (Antes alguém entitulou como resolvido sem eu dizer nada O.O)

 

Muito obrigado kakaroto! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Com sua ajuda, pude entender melhor as regras rewrite para windows tb... :D

 

Bom, utilizei:

 

# urls amigaveis

RewriteCond %{SCRIPT_FILENAME} !-f

RewriteCond %{SCRIPT_FILENAME} !-d

 

RewriteRule ([a-zA-Z0-9_-]*)\/?([a-zA-Z0-9_-]*)$ /index.php?parametro1=$1&parametro2=$2

 

E um switch normal como os demais....

Era exatamente isto que eu precisava e bolamos depois de muita luta, pois meu localhost no windows não queria aceitar nenhuma regra com mais de um parâmetro, muito estranho isso, mas finalmente resolvemos...

 

Bom, fica aí a dica pra quem também tiver este problema!

 

Att.

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.