Jump to content
Dárcio Gomes

Condições com expressão regular no .htaccess

Recommended Posts

Salve galera...

 

estou a fazer algumas melhorias em nossa plataforma web e algumas decisões estou a tratar direto no .htaccess, me barrei na seguinte situação:

 

no .htaccess tem um redirecionamento que quando o usuário acessa o site sem digitar o www o htacces se encarrega de acrescentar o www e redireciona para o dominio solicitado já com o www, até ai tudo certo, porém preciso definir um protocolo na url destino direto no htaccess para que funcione corretamente EX:http,https

 

gostaria que quando o site estivesse sendo acessado o proprio htaccess identificasse se o usuário está no https ou http e então direcionar para o protocolo que estiver na url para que não seja nescessário fazer isso através do PHP pois isso irá gerar mais um direcionamento, que se tratando de SEO não seria muito recomendado.

 

sei que há como verificar se o usuário está no https ou não, o problema é como criar uma expressão regular para se aplicar a essa regra?

 

por exemplo:

no PHP usaria assim:

if($_SERVER['HTTPS'] == 'on'){
     echo "https://www.dominio.com.br";
}else{
     echo "http://www.dominio.com.br";
}
a mesma constante pode ser utilizada no htaccess da seguinte forma %{HTTPS}.

esse é meu htaccess atual:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www [NC]
RewriteCond %{HTTP_HOST} \.(br|com|net|org|adv|ind|art|eng|inf|tur|srv|tv)$ [NC]
RewriteRule ^(.*) [url=]http://www.%[/url]{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule !\.(txt|css|js|gif|jpeg|jpg|png|ico|JPG|JPEG|PNG|GIF|eot|ttf|woff|woff2|php|html|ogg|mp3|mp4|wma|avi|xml)$ run.php

 

meu problema está na penúltima linha, gostaria que ficasse da seguinte forma:

 

gostaria que ficasse assim:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www [NC]
RewriteCond %{HTTP_HOST} \.(br|com|net|org|adv|ind|art|eng|inf|tur|srv|tv)$ [NC]
RewriteRule ^(.*) (aqui a expressão que defina se está no https ou http)://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule !\.(txt|css|js|gif|jpeg|jpg|png|ico|JPG|JPEG|PNG|GIF|eot|ttf|woff|woff2|php|html|ogg|mp3|mp4|wma|avi|xml)$ run.php

 

Como não sou muito bom em expressão regular não consegui achar uma lógica que funcione como preciso, alguém poderia me dar alguma dica de como criar uma expressão regular que atenda essa necessidade?

 

desde já agradeço a todos que se dispuserem a dar essa força.

 

abraço a todos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Carcleo
      A ideia:
       
      toda e entrada no site, seja com link direto do tipo:
       
      www.site.com.br/pasta1/pasta2/arquivo.php  
      ou normal url amigável
       
      www.site.com.br/categoria/tipo  
      tudo queria que redirecionasse para o index.php da raiz do site.
       
      E que, caso o arquivo ou pasta NÃO existisse, abrisse normalmente a pagina 404.php
       
       
      Tentei de tres formas mas nenhuma dá certo.
       
      Primeira forma
      RewriteEngine On ErrorDocument 400 http://www.sortecard.com.br/index.php ErrorDocument 401 http://www.sortecard.com.br/401.php ErrorDocument 403 http://www.sortecard.com.br/403.php ErrorDocument 404 http://www.sortecard.com.br/404.php ErrorDocument 500 http://www.sortecard.com.br/500.php php_value allow_url_fopen on php_value allow_url_include on php_flag mail_filter 0 RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)$ index.php?page=$1 Segunda forma:
      Options +FollowSymLinks DirectorySlash On RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} \.php$ RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?request=$1 [L] Terceira forma:
      RewriteEngine On ErrorDocument 400 http://www.sortecard.com.br/index.php ErrorDocument 401 http://www.sortecard.com.br/401.php ErrorDocument 403 http://www.sortecard.com.br/403.php ErrorDocument 404 http://www.sortecard.com.br/404.php ErrorDocument 500 http://www.sortecard.com.br/500.php php_value allow_url_fopen on php_value allow_url_include on php_flag mail_filter 0 RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteRule ^(.*)$ index.php?page=$1 Problemas:
       
      A) Quando acesso a url diretamente não está redirecionando para o index.
      B) Quando falo que é para redirecionar todos os arquivos ele não me dá os parêmetros. 
    • By WitchMad
      Ooi guys! Seguinte:
      Estou precisando fazer uma URL amigável para as publicações de um fórum
      Para consultar a publicação é enviado um valores pela URL, dessa forma:
      post.php?id=1&titulo=Tecnologia da Informação ligada ao Poder Judiciário - Um pequeno Histórico
      Eu queria fazer com que ficasse dessa forma a URL:
      post/1/tecnologia-da-informação-ligada-ao-poder-judiciário-um-pequeno-histórico
       
      Não faço a mínima ideia de como fazer isso.
      Desde já, Agradeço
    • By Henrique83vrdrhu47h
      Ao tentar baixar o arquivo com a extensão .EXE no site, os arquivos estão vindo como .GZ
      Ambiente
      Centos 7 64
      Apache 2.4.6
      Mudando o arquivo em /etc/httpd/conf/httpd.conf Eu já tentei usar cada um destes métodos abaixo, no entanto, sem sucesso (eu reiniciei o apache e deletei o cache do navegador em cada tentativa):
      1: SetEnvIfNoCase Request_URI .exe $ no-gzip não varia
      2: SetEnv não-gzip 1
      3: SetEnv mod_deflate off
      4: SetEnv no-gzip off
      5: No arquivo /etc/httpd/conf.modules.d/00-base.conf eu comentei: LoadModule deflate_module modules / mod_deflate.so
      6: Eu tentei apagar o arquivo, mas não funcionou. /usr/lib64/httpd/modules/mod_deflate.so
      Toda ajuda é bem vinda.
      Eu pesquisei muito, confiei em vários testes com soluções semelhantes, mas sem sucesso.
      Eu não sei mais o que tentar.
    • By brunoogm
      Pessoal estou com um código onde tenho uma tabela Comanda e uma Quantidadevendacomanda, e preciso através da mesma pagina php criar a comanda e inserir  valores nas duas...
      Então preciso criar a tabela comanda, em seguida pegar o ID e após isso inserir na tabela Quantidadevendacomanda os seus valores junto com esse ID.
       
      Até ai tudo OK, mas...
       
      Preciso que na segunda vez que essa ação for feita ele verifique se essa comanda já existe e se existir ele apenas use o ID para inserir mais um valor na tabela Quantidadevendacomanda.
       
      E ai surge o problema, no meu código usei uma SESSION para armazenar o ID da tabela comanda e se ele for 0 (Zero) ele cai na condição que cria a comanda nova senão ele apenas usa o ID na outra tabela, então na finalização eu faço com que a SESSION receba 0 novamente e o ciclo continua...
       
      O que acontece é o seguinte, sempre que a SESSION vale zero e eu tento criar a comanda e inserir valor na Quantidadevenda... ele não faz, mas se eu tentar pela segunda vez ele faz certinho
       
      Resumindo, toda vez que a SESSION é 0 ele pula o insert da segunda tabela, mas pega o ID e na proxima vez ele executa como determinado
       
       
      Codigo ::
       
      session_start();
      include_once("php/conexao.php");
      $idPessoa = $_SESSION['id_pessoa'];
      $id_cliente = $_SESSION['id_user']; 
      $cont = $_SESSION['cont'];
      echo $cont;

      if ($cont == 0) {
          
          $insert ="INSERT INTO comanda (CodigoCliente,  CodigoSituacao, ValorTotal) VALUES ('$id_cliente','1', '$codigoprato')";
          $resulta = mysqli_query ($conectar, $insert);
       
          $sql = "SELECT MAX(CodigoComanda) FROM comanda";
                      $resultado_banco = @mysqli_query($conectar, $sql);
                          
                      $inter = mysqli_num_rows ($resultado_banco);
                      if ($inter == 0){
                          echo "Erro";
                      }else {
                          $dados = @mysqli_fetch_array($resultado_banco);
                      }
                          
                      $id_comanda= $dados[0];
                      $_SESSION['cont'] = $id_comanda;
          
      }
      $select = "INSERT INTO quantidadevendacomanda (CodigoComanda, CodigoPrato , CodigoCliente, Quantidade,  Preco) VALUES ('$cont','$codigoprato', '$idPessoa','$quantidade', '$valor')";
      $resultado = @mysqli_query($conectar, $select);
       
       
      Na outra tabela tenho um UPDATE referente a outra coisa e o 
       
      $_SESSION['cont'] = 0;
       
      assim quando ele voltar ele cai na condição...
       
      Alguma dica de como fazer isso funcionar???
       

       
    • By daemon
      Boa noite,
       
      Tenho diversos arquivos .php e gostaria de ocultar eles..
       
      Exemplo: teste.php 
      www.meudominio.com/teste (Funcionar sem a extensao)..
       
       
      No arquivo .htaccess eu adiciono:

       
      RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.php [NC,L] O problema é quando digito www.meudominio.com.br/teste/ (mais uma barra para esquerda) da erro.
       
      Não funciona com mais de 1 diretório.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.