Ir para conteúdo

POWERED BY:

Arquivado

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

M@rc

url amigavel

Recommended Posts

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

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

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

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

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

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

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

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

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:

 

Screen_Shot_2013_06_28_at_4_45_37_PM.png

 

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.