Ir para conteúdo

Arquivado

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

Vitor Leite

Erro Apache

Recommended Posts

Oi pessoal, tudo bem?

 

Como posso permitir a barra no final da url, pois meu .htaccess:
permite assim: /home mas não assim: /home/

 

Tentei formular o código abaixo:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)/?$ $1.php

Porém sem sucesso, aparentemente se eu digitar: index/ ele redireciona pro arquivo index/.php que não existe.
Alguém tem uma solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... vejo que você está redirecionando para o arquivo 1.php. Ele existe?

 

Em todo caso acabei de criar o comportamento de url amigáveis para o novo website que vou fazer segue abaixo:

Regra .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?action=$1 [NC,L]

Qualquer entrada adicionada pós endereço do website será considerada uma entrada GET = action. Mesmo sendo várias requisições GET.

Exemplo:

https://siteurl/joao > action será joao

https://siteurl/joao/maria > action será joao/maria (uma única string com a barra)

Ou seja não importa quantas barras tiver sempre vai ser uma única string

 

Então para separar cada coisa criei uma método de classe para fazer o gerenciamento das entradas. (A classe só tem esse método mesmo. Porque como disse acabei de criar)

Perceba que o filtro é aplicado sobre "action" da regra htaccess

Spoiler

<?php

class SeoApi {

    public static function getUrl() {
        $url = strip_tags(filter_input(INPUT_GET, 'action', FILTER_DEFAULT));
        if (!empty($url)) {
            $return = explode('/', $url);
            return ($return);
        } else {
            return (false);
        }
    }



}

 

 

Então o que o método faz se existir a entrada aplica um filtro padrão e separa cada coisa pela barra.

Se a url for https://siteurl/joao > retorno será array(0) = joao

Se a url for https://siteurl/joao/maria > retorno será array(0) = joao / array(1) maria

E assim sucessivamente com cada barra colocada na navegação

 

Então me utilizo de uma classe que criei já a muito tempo para eliminar qualquer tipo de injeção de código.

Spoiler

<?php

/**
 * ****************************************
 * * @Class StrClean
 * * @author Spell-Master (Omar Pautz)
 * * @version 1.0 (2018)
 * * @requires PHP 5.5 ou superior
 * ****************************************
 * * Faz gerenciamento de strings.
 * * ATENÇÃO!!!
 * - Esse aquivo só pode ser salvo com
 * codificação "utf8" para correto
 * funcionamento da classe.
 * - Caracteres ANSI enviados para
 * tratamento podem aprentar anomalias
 * pós tratados se a codificação da url não
 * for utf8.
 * - Certifique-se que sua aplicação
 * somente trabalhe em UTF-8.
 * ****************************************
 */
class StrClean {

    private $data;
    private $match;

    /**
     * ****************************************
     * * @method : Remove todos os tipos de
     * caracteres não aceitáveis de uma string
     * ****************************************
     */
    public function formatStr($string) {
        $this->match = array();
        $this->match['a'] = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜüÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿRr"!@#$%&*()_-+={[}]/?;:.,\\\'<>°ºª`';
        $this->match['b'] = 'aaaaaaaceeeeiiiidnoooooouuuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr                                  ';
        $this->data = strtr(utf8_decode($string), utf8_decode($this->match['a']), $this->match['b']);
        $this->data = strip_tags(trim($this->data));
        $this->data = preg_replace('/[ -]+/', '-', $this->data);
        return utf8_encode(strtolower($this->data));
    }

    /**
     * ****************************************
     * * @method : Limpa string removendo dados
     * usando em injeção de código.
     * - Ideal para tratamento de URL amigável
     * ****************************************
     */
    public function clearUrl($string) {
        $this->data = (string) $string;
        $this->data = filter_var($this->data, FILTER_SANITIZE_URL);
        if (preg_match_all('/[$|%|*|(|)|+|<|>]/', $this->data)) {
            return preg_replace('/[^A-Za-z0-9-]/', '', strtolower($this->data));
        } else if (filter_var($this->data, FILTER_VALIDATE_URL)) {
            $str = $this->formatStr($this->data);
            return $str;
        } else {
            return preg_replace('/[^A-Za-z0-9-]/', '', strtolower($this->data));
        }
    }

    /**
     * ****************************************
     * * @method : Criptograga dados
     * ****************************************
     */
    public function baseEncode($string) {
        $this->data = (string) $string;
        return base64_encode($this->data);
    }

    /**
     * ****************************************
     * * @method : Remove criptografia de dados
     * com base64
     * ****************************************
     */
    public function baseDecode($string) {
        $this->data = (string) $string;
        return base64_decode($this->data);
    }

    /**
     * ****************************************
     * * @method : Criptografa entradas XML 
     * para Syntax HTML
     * ****************************************
     */
    public function xmlEncode($string) {
        $this->data = (string) $string;
        return str_replace(['&', '"', "'", '<', '>', ' '], ['&amp;', '&quot;', '&apos;', '&lt;', '&gt;', '-'], $this->data);
    }

    /**
     * ****************************************
     * * @method : Descriptografa entradas de 
     * Syntax HTML para XML
     * ****************************************
     */
    public function xmlDecode($string) {
        $this->data = (string) $string;
        return str_replace(['&amp;', '&quot;', '&apos;', '&lt;', '&gt;', '-'], ['&', '"', "'", '<', '>', ' '], $this->data);
    }

    /**
     * ****************************************
     * * @method : Converte datas para o 
     * formato latino americano.
     * ****************************************
     */
    public function invertDate($date) {
        return implode('/', array_reverse(explode('-', $date)));
    }

}

 

 

Com os dados tratados agora é só incluir os arquivos. Para isso criei essa function

Spoiler

<?php
function InitGet($initFile) {
    $initGet = null;
    if (isset($initFile)) {
        if (!$initGet && file_exists(__DIR__ . '/../../front/init/' . $initFile . '.php')) {
            $initGet = true;
            return (__DIR__ . '/../../front/init/' . $initFile . '.php');
        }
    }
    if (!$initGet) {
        return (__DIR__ . '/../../front/error/404.php');
    }
}

 

 

Essa função está no seguinte diretório: /system/function/

Então o que faz é sair desse diretório entrar no diretório /front/init/ e procurar o arquivo que é enviado como parâmetro. Se ele existir e ainda não foi solicitado irá retornar ele, caso contrário vai buscar um arquivo 404.php (No que retorna o erro caso alguém acesse alguma página/dados que eu não queira que ele acesse)

Se for usar aconselho que modifique para a arquitetura de seu projeto.

 

Então é só fazer o processo de inclusão:

<?php
// Isso é feito no index.php

$clear = new StrClean(); // Cria o objeto da classe que vai limpar a string
$getUrl = SeoApi::getUrl(); // obtem a string "action" da regra htaccess e separa os dados em array quando necessário

// Ativa a função de busca de arquivos para incluir a entrada do primeiro índice da array,
//caso ela não exista inclui o arquivo "default.php"
include (InitGet(isset($getUrl[0]) ? $clear->clearUrl($getUrl[0]) : 'default'));

 

Ou seja digamos que exista uma página assim: siteurl/cursos/ o arquivo cursos.php será solicitado.

Assim sendo é só aplicar a mesma lógica caso venha a usar sub páginas tipo https://siteurl/cursos/javascript/jquery

O index requisita o arquivo cursos.php e nesse arquivo tenho as entradas $getUrl[1] que é javascrit$getUrl[2] que é jquery para fazer o que quiser com elas.

 

E sempre que você acessa o website por padrão a regra já aplica uma barra no final do endereço.

 

Um outro exemplo mais simples eu coloquei no github: https://github.com/Spell-Master/Get-UrlAmigavel

 

Acho que seja essa sua dúvida....

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por luiz monteiro
      Boa tarde!
      Estou tentando criar uma url amigável, porem o htaccess não reconhece o arquivo sem a extensão.
      O objetivo é deixar a url assim:
      https://dominio.com.br/arquivo/id
       
      Estou usando essa regra no HTACCESS
       
      RewriteEngine On
      RewriteCond %{SCRIPT_FILENAME} !-f
      RewriteCond %{SCRIPT_FILENAME} !-d
      RewriteRule ^(.*)$ index.php [NC,L]
       
      No wampserver local funciona, porem no servidor online não.
       
      No online só aceita dessa maneira
      https://dominio.com.br/arquivo.php/id
      Sem a extensão não aceita.
       
       
      Tentei assim também
       
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php [NC,L]
       
      No wampserver local ok, porem no online não.
       
      Estou recuperando a id com o filter_input(INPUT_SERVER, 'REQUEST_URI') que no wampserver tudo ok, apenas no online não
       
      Agradeço desde já.
       
    • Por Jack Oliveira
      Ola pessoal boa noite a todos...
      Estou tendo uma dificuldade em passar a url que esta sendo digitada no nagevador
      Ou seja uma das url ate que passa, porem as demais url não mostra sempre a mesma pagina que foi aberta
      Creio que seria um tipo de conflitos
      por exemplo: se eu acessar a seguinte url
      Ex1: meusite.com/sao-paulo/list/minha-empresa-aqui/
      e se eu acessar outra url com o mesmo no da empresa da seguinte forma
      Ex2: meusite.com/sao-paulo/catalogo/minha-empresa-aqui/
      ela teria que mostrar o que esta no EX2 mais porem fica na pagina do EX1 mais com a url no navegador do Ex2
      Bom e tbm preciso passar os paramentros da pagina de pesquisa 
      ou fazer uma busca a url me retorna a seguinte forma
      EX3: meusite.com/buscar/?search_string=mercados&cidade=sao-paulo
      e quero que seja mostrar desta forma, 
      EX4: meusite.com/sao-paulo/buscar/mercados/
      caso tenha paginação ela ficar assim ao pegar paginação meusite.com/sao-paulo/buscar/mercados/12/
      Ou seja o que preciso é que não importar quanto paramentros seja queria que mostrasse conforme mostra no comentario do PHP
      segue o código logo a baixo com htaccess
      Talvez seja até coisa simples de se resolver ou pode ser eu fazendo da forma incorreta aqui...
       
      HTACCESS
       
      RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [NC,L] INDEX.PHP
       
      <?php ob_start(); session_cache_expire(60); //session_start(); if (!file_exists('CPANELUSER/database/config.php')) { header("Location: CPANELUSER/setup.php"); } else { require_once ('CPANELUSER/database/config.php'); } require_once ('CPANELUSER/database/config.painel.php'); require_once ('CPANELUSER/database/config.database..php'); require_once ('CPANELUSER/database/config.session.php'); require_once ('CPANELUSER/includes/funcoes.php'); // Obtendo o URL dos arquivos atual //$page = substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1); function UrlAmigavelPHP(){ if(isset($_GET['url'])) { $url = $_GET['url'] ? $_GET['url'] : "home"; //$search_string = $_GET['search_string'] ? $_GET['search_string'] : "home"; //$cidade = $_GET['cidade'] ? $_GET['cidade'] : "home"; //var_dump($url); //var_dump($search_string); //var_dump($cidade); $UrlFormatada = explode('/', $_SERVER['REQUEST_URI']); if(empty($UrlFormatada[1])) { $URL1 = ''; }else{ $URL1 = ''.$UrlFormatada[1].'/'; } if(empty($UrlFormatada[2])) { $URL2 = ''; }else{ $URL2 = ''.$UrlFormatada[2].'/'; } if(empty($UrlFormatada[3])) { $URL3 = ''; }else{ $URL3 = ''.$UrlFormatada[3].'/'; } if(empty($UrlFormatada[4])) { $URL4 = ''; }else{ $URL4 = ''.$UrlFormatada[4].'/'; } if(empty($UrlFormatada[5])) { $URL5 = ''; }else{ $URL5 = ''.$UrlFormatada[5].'/'; } if(empty($UrlFormatada[6])) { $URL6 = ''; }else{ $URL6 = ''.$UrlFormatada[6].'/'; } //Passando a url completa $Paramentros = ''.$URL1.''.$URL2.''.$URL3.''.$URL4.''.$URL5.''.$URL6.''; }else{ $url = 'home'; } switch($url) { //HOME case 'home'; include_once('directory-home.php'); //meusite.com/cidade-principal/ que vai aparecer no index.php break; //LISTAGEM case $Paramentros; include_once('directory-listagem.php'); //meusite.com/cidade-principal/list/nome-de-uma-empresa/ break; //CATALOGO case $Paramentros; $Query = DBRead('directory_cidades','*',"WHERE status='1' AND slug='".GetUrlBasecidade."'")[0]; $TblEmpresa = DBRead("directory_listing","*","WHERE slug='".GetUrlBase."' AND cidade='{$Query['titulo']}'"); if (is_array($TblEmpresa)) { foreach ($TblEmpresa as $Empresa) { extract($Empresa); $titles = ''.trim(mb_convert_case($titulo, MB_CASE_TITLE, "UTF-8")).' | '.trim(mb_convert_case(ConfigPainel("site_nome"), MB_CASE_TITLE, "UTF-8")).''; $getId = $id; $getu = $id_user; //Url Menu Lateral das Empresas $CidadeUrl = ''.ConfigPainel("site_url").''.GetUrlBasecidade.'/'; $UrlEmpresa = ''.$CidadeUrl.'list/'.GetUrlBase.'/'; $UrlCatalogo = ''.$CidadeUrl.'catalogo/'.GetUrlBase.'/'; $UrlPortfolio = ''.$CidadeUrl.'portfolio/'.GetUrlBase.'/'; $UrlEventos = ''.$CidadeUrl.'agenda/'.GetUrlBase.'/'; $UrlClassificados = ''.$CidadeUrl.'vagas/'.GetUrlBase.'/'; $UrlContato = ''.UrlAmigavel($menu5).''; //Pegando os ids switch ($Empresa['id_destaque']) { case '5': $index_seo = ''; break; case '4': $index_seo = 4; break; case '3': $index_seo = 3; break; case '2': $index_seo = 2; break; case '1': $index_seo = 1; break; case '0': $index_seo = 0; break; } $Query = DBRead('directory_itens','*',"WHERE status='1' AND user_id='{$getu}' ORDER BY nome_item ASC LIMIT 100"); $NomeCity =''.$cidade.''; define("METAKEYWORD", $palavra_chave); define("METADESCRIPTION", $frase); define("METATITLE", ''.(!empty($definir) ? 'Cardápio | '.LetraMaiuscula($titulo) : 'Catálogo | '.LetraMaiuscula($titulo).'').' | '.ConfigPainel("site_nome").''); //1 Cardápio > 2 Catálogo > 3 Imóveis > 4 Produtos //Configuração $QueryEmpresa = DBRead('directory_listing','*',"WHERE id_user='{$getu}' ORDER BY id LIMIT 1")[0]; //company-product $QueryItemCount = DBRead('directory_itens','*', "WHERE status= '1' AND user_id='{$getu}' ORDER BY nome_item")[0]; if($definir == 1) { $Menu1 = $QueryEmpresa['menu1']; if($QueryItemCount['user_id'] == $getu) { $Status1 = 1; //1 Ativo }else{ $Status1 = 0; //0 Inativo } $Icone = 'fa-cutlery'; }elseif($definir == 2) { $Menu1 = $QueryEmpresa['menu1']; if($QueryItemCount['user_id'] == $getu) { $Status1 = 1; //1 Ativo }else{ $Status1 = 0; //0 Inativo } $Icone = 'fa-shopping-bag'; }elseif($definir == 3) { $Menu1 = $QueryEmpresa['menu1']; if($QueryItemCount['user_id'] == $getu) { $Status1 = 1; //1 Ativo }else{ $Status1 = 0; //0 Inativo } $Icone = 'fa-home'; }elseif($definir == 4) { $Menu1 = $QueryEmpresa['menu1']; if($QueryItemCount['user_id'] == $getu) { $Status1 = 1; //1 Ativo }else{ $Status1 = 0; //0 Inativo } $Icone = 'fa-product-hunt'; } //company-portfolio $QueryPorCount = DBRead('directory_portifolio','*', "WHERE status= '1' AND id_user = '{$getu}' ORDER BY id")[0]; $Menu2 = $QueryEmpresa['menu2']; if($QueryPorCount['id_user'] == $getu) { $Status2 = 1; //1 Ativo }else{ $Status2 = 0; //0 Inativo } //company-events $Menu3 = $QueryEmpresa['menu3']; $QueryAgCount = DBRead('directory_agenda','*', "WHERE status= '1' AND idempresa = '{$getId}'")[0]; if($QueryAgCount['idempresa'] == $getId) { $Status3 = 1; //1 Ativo }else{ $Status3 = 0; //0 Inativo } //company-blog $QueryNumBlog = DBRead('directory_emprego','*',"WHERE status='1' AND id_empresa = '{$getId}'")[0]; $Menu4 = $QueryEmpresa['menu4']; if($QueryNumBlog['id_empresa'] == $getId) { $Status4 = 1; //1 Ativo }else{ $Status4 = 0; //0 Inativo } //company-contact $Menu5 = $QueryEmpresa['menu5']; define("METAURL", "".ConfigPainel("site_url")."".$UrlCatalogo.""); define("METAIMAGEM", "".ConfigPainel("site_url")."assets/".GetUrlBase."/".$logo.""); if (empty($index_seo)) { define("METAINDEXAR", "noall, noindex, nofollow"); //noall, noindex, nofollow //Redireciona(ConfigPainel("site_url")); }else{ define("METAINDEXAR", "all, index, follow"); //all, index, follow } } } else{ //Redireciona(''.ConfigPainel("site_url").''.UrlAmigavel($cidade).'/'); } require_once('Inc/hora.php'); $diasemana = array('Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sabado'); $data = date('Y-m-d'); $diasemana_numero = date('w', strtotime($data)); $diadehoje = $diasemana[$diasemana_numero]; //$todososdias = 'null'; include_once('directory-catalogo.php');//meusite.com/cidade-principal/catalogo/nome-de-uma-empresa/ break; //PORTFOLIO case $Paramentros; include_once('directory-portfolio.php');//meusite.com/cidade-principal/portfolio/nome-de-uma-empresa/ break; //AGENDA case $Paramentros; include_once('directory-agenda.php');//meusite.com/cidade-principal/agenda/nome-de-uma-empresa/ break; //BLOG case $Paramentros; include_once('directory-blog.php');//meusite.com/cidade-principal/vagas/nome-de-uma-empresa/ break; //PESQUISAR case $Paramentros; include_once('directory-buscar.php');//meusite.com/cidade-principal/buscar/loja/ break; //SOBRE case $Paramentros; include_once('directory-sobre.php');//meusite.com/cidade-principal/sobre/ break; //PLANO case $Paramentros; include_once('directory-plano.php');//meusite.com/cidade-principal/plano/ break; //CONTATO case $Paramentros; include_once('directory-contato.php');//meusite.com/cidade-principal/contato/ break; default; include_once('directory-404.php'); break; } } UrlAmigavelPHP(); ?> Perdoa se ficou muito grande os codigo ai na parte do catalogo coloquei para poder ver como estou recendo os paramentros
       
      Desde já fico no guardo se alguém puder dar uma idiea ai
    • Por mateus.andriollo
      Tenho a necessidade de implanta htaccess apenas em uma subpasta tipo dominio.com.br/produto aí teria dominio.com.br/produto/tp0001
       
      Ele retornaria apenas estes produto de código tp0001
       
    • Por Marcos RJ
      Bom dia, boa tarde, boa noite colegas.
       
      Tenho um projeto onde conterá diversos subdomínios. Ex.:
      empresa1.site.com.br empresa2.site.com.br empresa3.site.com.br Esses subdomínios acessarão o sistema que está dentro do seguinte diretório:
      site.com.br/sistema/ Gostaria de fazer com que os subdomínios acessassem o sistema sem alterar a url, pois o objetivo é quando fizer quaisquer alterações e/ou inclusões de novos recursos, não tenhamos a necessidade de fazer isso dentro de todos os subdomínios, haja vista que serão dezenas ou até mesmo centenas de subdomínios. As minhas tentativas foram diretamente no .htaccess:
      RewriteEngine on RewriteCond %{HTTP_HOST} ^empresa1.site.com$ [OR] RewriteCond %{HTTP_HOST} ^www.empresa1.site.com$ RewriteRule ^(.*) http://www.site.com/sistema/$1?key=empresa1 [P,L] E o PHP ficou dessa forma:
       
      $diretorio = $_REQUEST["key"]; if($directory != null){    require "http://".$diretorio.".site.com.br/sistema/class/conectCass.php"; }else{  require "conectClass.php";  } Mas não deu certo. Tentei diretamente pelo PHP, mas quando clico no link criado, ele me obriga que a página do link esteja dentro dos subdiretórios. Em cada subdomínio coloquei da seguinte forma:
      include 'sistema/'; E no index.php do diretório sistema/:
      $host = $_SERVER['SERVER_NAME']; $host = str_replace(['www.', '.site.com.br', 'site.com.br'], '', $host); if($host == '') {     // entra o conteúdo do sistema } else {     // Entra o conteúdo do subdomínio } Mas também não funcionou. Como eu poderia resolver isso?

      Muito obrigado!
    • Por Diogo Ribeiro da Silva
      Eu comprei a loja virtual v12 a algum tempo atrás e no boleto bancário gerado pela loja estava aparecendo alguns pontos de interrogação foi o único problema encontrado.
       
      Eu entrei em contato com a pessoa informando o problema e ela, "eu não lembro direito porque tem cerca de 4 anos isso" me deu algum arquivo pra colocar em uma pasta da loja e o problema foi resolvido.
       
      Infelizmente eu perdi o contato dessa pessoa e o arquivo e no momento estou precisando muito resolver esse problema porque eu estou desempregado e estou com um projeto pra ter uma loja virtual.
       
      Gostaria de saber se alguém pode me ajudar com esse problema.
       
      Gostaria muito que meu conteúdo fosse aprovado por um moderador porque me ajudaria muito e a outras pessoas.

×

Informação importante

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