Ir para conteúdo

POWERED BY:

Arquivado

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

paladino_php

URL amigáveis

Recommended Posts

Como faço para passar parâmetros opcionais pela URL? Exemplo:

 

Url amigável original: http://www.meusite.com.br/noticias

Url quando selecionado a qtd de itens por página: http://www.meusite.com.br/noticias/15

Url quando clicado na noticia completa: http://www.meusite.com.br/noticias/11/noticia_completa

 

Regra do HTACCESS, que me parece estar uma gambiarra, mas emfim:

 

RewriteRule ^noticias/([0-9]+)/?(([0-9]+)/)?(.*)-?/?$ noticias.php?id_noticia=$1&show=$2&noticia=$1 [NC,L]  

 

Me ajudem a fechar essa regra, pfv. =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente:

 

 

 


RewriteRule ^noticias$ /noticias.php [L]
RewriteRule ^noticias\/([^/]*)$ /noticias.php?limite=$1 [L]
RewriteRule ^noticias\/([^/]*)\/([^/]*)$ /noticias.php?limite=$1&uid=$2 [L]

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

aproveitando o assunto também queria saber se podem tirar uma duvida , assim eu já tenho uma regra no meu htaccess

que é essa

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ perfil.php?pg=usuario&user=$1 [NC,L]

 

 

como eu faço para fazez uma regra pra este link de baixo queria que ficasse artistas/

 

index.php?pg=artist_single&artista=5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, eu recomendo simplificar essas regras do htaccess.

 

Passa tudo pra um parâmetro, por exemplo:

RewriteRule (.*) index.php?page=$1 [L]

 

Então, em index.php você analisa a string com expressões regulares e roteia a requisição pra página adequada. Acho que isso facilita o trabalho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, eu recomendo simplificar essas regras do htaccess.

 

Não acho que simplificar seja a melhor solução.

 

Então, em index.php você analisa a string com expressões regulares

 

Mas não é isso que o HTACCESS está fazendo, verificando os parâmetros com ER?

rs

 

Não gosto de usar o (.*) porque generaliza muito, e aqui estou trabalhando com valores precisos*. Não é repressão, apenas meu ponto de vista, pra alguns pode ate funcionar, mas no meu caso não resolve. =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

No PHP você tem uma liberdade muito maior e mais recursos pra analisar a URI.

 

E simplificar é quase sempre a melhor solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites
E simplificar é quase sempre a melhor solução.

Seria uma apologia à gambiarra ?

 

Rewrite é movido a ER...ou seja, o filtro tem que ser na própria condição rewrite.

 

aproveitando o assunto também queria saber se podem tirar uma duvida , assim eu já tenho uma regra no meu htaccess

que é essa

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ perfil.php?pg=usuario&user=$1 [NC,L]

 

 

como eu faço para fazez uma regra pra este link de baixo queria que ficasse artistas/

 

index.php?pg=artist_single&artista=5

 

seria www.dominio.com/musica/cantor ?

 

desse jeito:

RewriteRule ^(.*)$ perfil.php?pg=usuario&user=$1 [NC,L]

 

fica www.dominio.com/nomedousuario

então voce tera que criar um ER para captar o nome do usuario e a pagina usuario

ficando www.dominio.com/usuario/01100011cc

 

veja como pode ser feito :

 

ER-> ^(usuario|noticia|perfil)/(([a-zA-Z0-9]+)?)$

A primeira tem que ser ou usuario, ou noticia ou perfil, caso queira mudar adicione '|'.A segunda deve ser letras alfabeticas ou numero de 0 a 9

.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(usuario|noticia|perfil)/(([a-zA-Z0-9]+)?)$ /index.php?pg=$1&usuario=$2 [NC,L]

ErrorDocument 404 /404.html

 

ErrorDocument 404 /404.html mostra erro caro o usuario inventou url como algoasdas/#!@1253

 

index.php:

<?php

if(isset($_GET['pg']) and isset($_GET['usuario'])){

$pagina = $_GET['pg']; //serve para incluir a pagina que é usuario ou perfil ou outro que tu queria
$user = $_GET['usuario']; //nome do usuario

echo $pagina.' / '.$user;

}

?>

 

Pagina 404.html:

<html><head><title>erro 404</title></head><body><h1>Erro 404</h1><h2>Pagina não encontrada</h2></body></html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Normalmente eu uso uma versão orientada a objetos de algo assim:

 

<IfModule mod_rewrite.c>
RewriteEngine	on

RewriteCond	%{REQUEST_FILENAME}	!-d
RewriteCond	%{REQUEST_FILENAME}	!-f
RewriteRule	(.*)	index.php?page=$1	[QSA,L]
</IfModule>

 

index.php

<?php
/**
* Requisição
*/
$page = isset($_GET['page'])? trim($_GET['page'], '/') : '';

/**
* Páginas
*/
$pages = array(
''			=> array('home.php'),
'noticias' 		=> array('news.php'),
'noticias/([0-9]+)' 	=> array('news.php', 'id' => '1'),
'categorias/([a-z-]+)' 	=> array('cat.php', 'name' => '1'),
'usuarios' 		=> array('users.php'),
'usuarios/([a-z_-]+)' 	=> array('users.php', 'name' => '1')
);

/**
* Roteador
*/
foreach($pages as $uri => $file)
{
if (preg_match('/^' . str_replace('/', '\/', $uri) . '$/', $page, $matches))
{
	$params = array_slice($file, 1);

	foreach ($params as &$param)
	{
		$param = $matches[$param];
	}

	var_dump($params);
	//include $file[0];

	break;
}
}

 

Funciona perfeitamente bem sobretudo em termos de escalabilidade da aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Normalmente eu uso uma versão orientada a objetos de algo assim:

 

<IfModule mod_rewrite.c>
RewriteEngine	on

RewriteCond	%{REQUEST_FILENAME}	!-d
RewriteCond	%{REQUEST_FILENAME}	!-f
RewriteRule	(.*)	index.php?page=$1	[QSA,L]
</IfModule>

 

index.php

<?php
/**
* Requisição
*/
$page = isset($_GET['page'])? trim($_GET['page'], '/') : '';

/**
* Páginas
*/
$pages = array(
''			=> array('home.php'),
'noticias' 		=> array('news.php'),
'noticias/([0-9]+)' 	=> array('news.php', 'id' => '1'),
'categorias/([a-z-]+)' 	=> array('cat.php', 'name' => '1'),
'usuarios' 		=> array('users.php'),
'usuarios/([a-z_-]+)' 	=> array('users.php', 'name' => '1')
);

/**
* Roteador
*/
foreach($pages as $uri => $file)
{
if (preg_match('/^' . str_replace('/', '\/', $uri) . '$/', $page, $matches))
{
	$params = array_slice($file, 1);

	foreach ($params as &$param)
	{
		$param = $matches[$param];
	}

	var_dump($params);
	//include $file[0];

	break;
}
}

 

Funciona perfeitamente bem sobretudo em termos de escalabilidade da aplicação.

 

É, assim é menos problemático...mais cadê essa tal orientação a objetos ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em OO, o Roteador é um objeto e as páginas são armazenadas dentro de um objeto Aplicação. Pode ser algo similar a isso em MVC:

<?php
abstract class Application
{
private $pages = array();

protected function addPage($pattern, $controller, $action, $params = null)
{
	...
}
}

class CompanySite extends Application
{
public function __construct()
{
	$this->addPage('', 			'HomePage', 'view');
	$this->addPage('noticias', 		'NewsPage', 'list');
	$this->addPage('noticias/([0-9]+)',	'NewsPage', 'view', array('id' => '1'));
}
}

class Router
{
public function route($uri)
{
	...
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria uma apologia à gambiarra ?

 

Rewrite é movido a ER...ou seja, o filtro tem que ser na própria condição rewrite.

 

 

 

seria www.dominio.com/musica/cantor ?

 

desse jeito:

RewriteRule ^(.*)$ perfil.php?pg=usuario&user=$1 [NC,L]

 

fica www.dominio.com/nomedousuario

então voce tera que criar um ER para captar o nome do usuario e a pagina usuario

ficando www.dominio.com/usuario/01100011cc

 

veja como pode ser feito :

 

ER-> ^(usuario|noticia|perfil)/(([a-zA-Z0-9]+)?)$

A primeira tem que ser ou usuario, ou noticia ou perfil, caso queira mudar adicione '|'.A segunda deve ser letras alfabeticas ou numero de 0 a 9

.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(usuario|noticia|perfil)/(([a-zA-Z0-9]+)?)$ /index.php?pg=$1&usuario=$2 [NC,L]

ErrorDocument 404 /404.html

 

ErrorDocument 404 /404.html mostra erro caro o usuario inventou url como algoasdas/#!@1253

 

index.php:

<?php

if(isset($_GET['pg']) and isset($_GET['usuario'])){

$pagina = $_GET['pg']; //serve para incluir a pagina que é usuario ou perfil ou outro que tu queria
$user = $_GET['usuario']; //nome do usuario

echo $pagina.' / '.$user;

}

?>

 

Pagina 404.html:

<html><head><title>erro 404</title></head><body><h1>Erro 404</h1><h2>Pagina não encontrada</h2></body></html>

 

acho que você não entendeu tipo , assim eu já tenho aquela regra RewriteRule ^(.*)$ perfil.php?pg=usuario&user=$1 [NC,L]

 

que serve para uma pagina que eu tenho . O que eu quero faser é criar mais uma regra só que pra outra pagina no caso esta aqui

http://localhost/index.php?pg=artist_single&artista=

 

ai eu não sei como faser pq não conheço muito de url amigavel comecei a utilizar tem 2 dias só .

o que eu quero faser e adicionar uma regra pra essa pagina que te falei ai ficando assim

meu dominio/artistas/id do artista

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém poderia me ajudar, por favor.

Estou passando um trabalhão para criar esse formato

 

Exemplo 1:

 

http://www.meusite.com.br/galerias.asp?gal=4&cat=3&subcat=3

 

meusite/[Nome-sub-categoria-midia]/[Nome-midia] meusite/decoracao/casa-e-jardim

 

Exemplo 2:

 

http://www.meusite.com.br/detalhes_imprensa.asp?id_ambientes=944&gal=4&cat=3&subcat=3

 

meusite/[Nome-midia]/[mes-ano] meusite/casa-e-jardim/dezembro-2012

 

Muito obrigada por sua ajuda.

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.