M@rc 1 Denunciar post Postado Junho 27, 2013 Blz pessoal Estou tentando colocar url amigavel no meu site mas não estou conseguindo. Atualmente esta: www.site.com.br/?page=home Arquivo .htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?page=$1 Pagina index.php onde usei includes para chamar as outras paginas do site: <?php $atual = (isset($_GET['page'])) ? $_GET['page'] : 'home'; $permissao = array('home', 'institucional', 'produtos', 'downloads', 'noticias', 'contato'); if(substr_count($atual, '/') >0){ $atual = explode('/', $atual); $pagina = (file_exists($atual.'.php') && in_array($atual, $permissao)); } ?> Quando digito www.site.com.br/home funciona, mas quando tento clicar em outro link do menu ele continua nessa pagina, tendo que digitar a url para sair da pagina, o que pode estar errado? Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Junho 27, 2013 Mostre o menu. Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 28, 2013 Segue menu: <div id="fundo_menu"> <div id="menu"> <div id="nav"> <ul> <li class="traco_esquerdo"><a href="?page=home">Home</a></li> <li class="traco_esquerdo"><a href="?page=institucional">Institucional</a></li> <li class="traco_esquerdo"><a href="?page=produtos">Produtos</a> <ul> <li class="traco_alto traco_baixo"><a href="?page=relogios">Relógios de Ponto</a></li> <li class="traco_baixo"><a href="?page=catracas">Catracas</a></li> <li class="traco_baixo"><a href="?page=controle">Controle de Acesso</a></li> <li class="traco_baixo"><a href="?page=softwares">Softwares</a></li> <li class="traco_baixo"><a href="?page=vigilancia">Vigilância</a></li> <li class="traco_baixo"><a href="?page=protocoladores">Protocoladores</a></li> <li class="traco_baixo"><a href="?page=acessorios">Acessórios</a></li> </ul> </li> <li class="traco_esquerdo"><a href="?page=downloads">Downloads</a></li> <li class="traco_esquerdo"><a href="?page=noticias">Notícias</a></li> <li class="traco_esquerdo traco_direito "><a href="?page=contato">Contato</a></li> </ul> </div> </div> </div> Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Junho 28, 2013 Basta você alterar as URLs. <div id="fundo_menu"> <div id="menu"> <div id="nav"> <ul> <li class="traco_esquerdo"><a href="/home">Home</a></li> <li class="traco_esquerdo"><a href="/institucional">Institucional</a></li> <li class="traco_esquerdo"><a href="/produtos">Produtos</a> <ul> <li class="traco_alto traco_baixo"><a href="/relogios">Relógios de Ponto</a></li> <li class="traco_baixo"><a href="/catracas">Catracas</a></li> <li class="traco_baixo"><a href="/controle">Controle de Acesso</a></li> <li class="traco_baixo"><a href="/softwares">Softwares</a></li> <li class="traco_baixo"><a href="/vigilancia">Vigilância</a></li> <li class="traco_baixo"><a href="/protocoladores">Protocoladores</a></li> <li class="traco_baixo"><a href="/acessorios">Acessórios</a></li> </ul> </li> <li class="traco_esquerdo"><a href="/downloads">Downloads</a></li> <li class="traco_esquerdo"><a href="/noticias">Notícias</a></li> <li class="traco_esquerdo traco_direito "><a href="/contato">Contato</a></li> </ul> </div> </div> </div> Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 28, 2013 Deu certo mas se puder me ajudar como faço para ter mais um nível? Exemplo: www.site.com.br/produtos/produto1 Alguem? Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Junho 28, 2013 Você pode utilizar algum routing para isso, veja se o Respect\Rest lhe ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 28, 2013 O meu site esta da seguinte forma: http://www.site.com.br/index.php?page=home Eu usei a seguinte expressão regular para excluir o index.php da url: Options +FollowSymLinks RewriteEngine On RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/ RewriteRule ^(([^/]+/)*)index\.php$ http://www.site.com.br/$1 [R=301,L] Tem como eu ocultar o ?page= que sobrou ficando somente o nome do arquivo? Isso já resolveria meu problema. Compartilhar este post Link para o post Compartilhar em outros sites
vonzuben 12 Denunciar post Postado Junho 28, 2013 Como assim ocultar, pois conforme o Enrico fez, ficaria assim já www.site.com.br/home Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 28, 2013 Deu certo quando acesso www.site.com.br/produtos mas quando acesso a pagina produtos.php onde dentro dela existem categorias de produtos e dentro das categorias de produtos existem os produtos a pagina não é chamada ficando na url www.site.com.br/produtos?page=categoria1 Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Junho 28, 2013 M@rc, use este htaccess: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] E podemos criar uma simples classe para mapear as URLs (bem simples): class UrlMatcher { private $url; private $pages = array(); public function __construct($url) { $this->url = $url; } public function addPage($url, $controller) { if (! is_callable($controller)) { throw new InvalidArgumentException(); } $this->pages[] = array( 'url' => $url, 'controller' => $controller, ); } public function match() { foreach ($this->pages as $page) { if ($this->url === $page['url']) { return call_user_func($page['controller']); } } throw new RuntimeException(); } } E para usar: $matcher = new UrlMatcher($_SERVER['REQUEST_URI']); $matcher->addPage('/home', function () { require 'home.php'; }); $matcher->addPage('/institucional', function () { require 'institucional.php'; }); $matcher->addPage('/produtos', function () { require 'produtos.php'; }); $matcher->addPage('/downloads', function () { require 'downloads.php'; }); $matcher->addPage('/noticias', function () { require 'noticias.php'; }); $matcher->addPage('/contato', function () { require 'contato.php'; }); try { $matcher->match(); } catch (RuntimeException $e) { echo 'Erro 404. Página não encontrada.'; } Isso você coloca em seu index.php. O que estiver na função é o que será executado. Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 28, 2013 Deixa eu ver se entendi, as duas parte eu coloco no index.php? Desculpa a falta de conhecimento mas estou começando a ver php agora. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Junho 28, 2013 Sim, uma boa prática seria criar dois arquivos: um 404.php para a página de 404 e um routes.php para configurar as rotas separadamente, ficando assim: - Seu index.php na pasta pública (acessível do servidor): class UrlMatcher { private $url; private $pages = array(); public function __construct($url) { $this->url = $url; } public function addPage($url, $controller) { if (! is_callable($controller)) { throw new InvalidArgumentException(); } $this->pages[] = array( 'url' => $url, 'controller' => $controller, ); } public function match() { foreach ($this->pages as $page) { if ($this->url === $page['url']) { return call_user_func($page['controller']); } } throw new RuntimeException(); } } $matcher = new UrlMatcher($_SERVER['REQUEST_URI']); require __DIR__ . '/../routes.php'; try { $matcher->match(); } catch (RuntimeException $e) { require __DIR__ . '/../pages/404.php'; } Uma pasta abaixo dentro do projeto (fora da pasta pública): - Seu arquivo routes.php: $matcher->addPage('/home', function () { require __DIR__ . '/pages/home.php'; }); $matcher->addPage('/institucional', function () { require __DIR__ . '/pages/institucional.php'; }); $matcher->addPage('/produtos', function () { require __DIR__ . '/pages/produtos.php'; }); $matcher->addPage('/downloads', function () { require __DIR__ . '/pages/downloads.php'; }); $matcher->addPage('/noticias', function () { require __DIR__ . '/pages/noticias.php'; }); $matcher->addPage('/contato', function () { require __DIR__ . '/pages/contato.php'; }); Dentro de uma pasta chamada pages você cria suas páginas. A estrutura fica assim: PS: a pasta public pode ser public_html, htdocs, www, etc. dependendo do seu servidor. PS 2: o arquivo routes.php fica fora da pasta pública, mas dentro da pasta do projeto. Com esta estrutura, além de ganhar uma organização maior, você ganha segurança pois os seus arquivos ficarão ocultos. Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 28, 2013 No servidor onde esta hospedado o site todos os arquivos estão na pasta /httpdocs mas creio que não tenho acesso a outra pasta antes dela que é onde você falou para colocar o routes.php, posso deixar esse arquivo direto na httpdocs? Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Junho 28, 2013 Então infelizmente sim. Você move tudo para a outra pasta mas não esqueça de alterar o index.php trocando as últimas linhas por: $matcher = new UrlMatcher($_SERVER['REQUEST_URI']); require __DIR__ . '/routes.php'; try { $matcher->match(); } catch (RuntimeException $e) { require __DIR__ . '/pages/404.php'; } Compartilhar este post Link para o post Compartilhar em outros sites
M@rc 1 Denunciar post Postado Junho 29, 2013 Vou fazer os teste, obrigado. Compartilhar este post Link para o post Compartilhar em outros sites