Ir para conteúdo

POWERED BY:

Arquivado

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

nikeweiand

Bloqueando acesso direto ao arquivo via htaccess

Recommended Posts

Boa noite.

 

Estou pesquisando uma maneira de bloquear o acesso diretamente ao arquivo .php de uma determinada pasta, por exemplo:

http://site.com.br/paginas/arquivo.php

 

Pretendo que sempre que seja solicitada essa URL a pessoa caia na pagina index principal do site.

Atualmente eu uso em meu htaccess:

 

RewriteRule ^((?:/?[a-zA-Z0-9_\-]+)*?/?)$ index.php?request=$0 [L]

 

Com ele todas as requisições são enviadas a pagina inicial, até ai tudo bem... porem se digitar a URL inteira do arquivo.php conforme exemplo que citei o arquivos é visualizado normalmente

 

Alguém sabe me ajudar? ou alguma dica??

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
A expressão regular que você está usando não contém o caractere ponto, portanto "arquivo.php" não casa com ela.


Mas talvez não seja apenas por isso que você ainda consegue acessar arquivos PHP diretamente. Provavelmente você também deve ter o seguinte em seu .htaccess:



RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d



São condições para que a regra de reescrita seja executada, e significam:

- Requisição não é um arquivo existente

- Requisição não é um diretório existente


Isso é necessário para que você consiga acessar arquivos que precisam ser acessados diretamente, como CSS, JS e imagens, mas acaba se aplicando a qualquer tipo de arquivo, desde que ele exista.


Você pode resolver isso definindo:

- Requisição não é um arquivo existente OU

- Requisição termina com .php


Assim:



RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} \.php$



Assim, se você tentar acessar um arquivo PHP diretamente, você será direcionado para index.php e $_GET['request'] irá retornar "index.php".


E quanto a sua regra de reescrita, você deve substituí-la por essa:



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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado mangakah! Resolveu meu problema ainda me deu algumas dicas muito boas!

 

Agora se não for pedir de mais, poderia me tirar algumas duvidas sobre a sintax do htaccess??

 

 

- O que significa [L], [F], [PT] ?

 

 

- Para adicionar mais items a lista de bloqueio:

RewriteCond %{REQUEST_FILENAME} \.php$

 

Ficaria dessa maneira? (exemplo)

RewriteCond %{REQUEST_FILENAME} \.(jpe?g|gif|bmp|png|php|doc|pdf)$

Compartilhar este post


Link para o post
Compartilhar em outros sites

- O que significa [L], [F], [PT] ?

 

L significa "last" (último) e indica ao Apache que se aquela regra bater, nenhuma outra regra subsequente no arquivo .htaccess deve ser avaliada. Sem ele o Apache continuaria lendo o arquivo e avaliando as outras regras que encontrar.

 

F significa forbidden -- se a regra bater, deve retornar erro 403 Forbidden (Acesso Negado)

 

PT significa passthrough e é raramente usada. Serve para o caso de você tiver um Alias para determinado diretório e desejar forçar o processamento desse Alias.

 

Veja mais na documentação: RewriteRules Flags.

 

-

 

Sua expressão para casar todos os arquivos com a extensão citada está correta. Mas note o seguinte: como você está colocando as extensões em um grupo, delimitado entre parenteses, o que casar neste grupo será armazenado em $1. Isso se chama 'retrovisor' (ou backreference, em inglês) e serve para chamar um texto que casou em um grupo anterior, sendo $1 para o primeiro grupo, $2 para segundo e assim por diante. O problema aí é que a extensão casada vai para $1 e o outro grupo ^(.*)$ vai para $2, e será redirecionado, caso seja um arquivo terminado em .jpeg, por exemplo, para index.php?request=jpeg. Para evitar isso você precisa indicar que esse grupo precisa ser ignorado, basta colocar '?:' logo após '(':

 

RewriteCond %{REQUEST_FILENAME} \.(?:jpe?g|gif|bmp|png|php|doc|pdf)$

 

-

 

Quanto ao problema com o diretório, não consegui reproduzir aqui. Provavelmente alguma outra regra em seu .htaccess esteja causando esse problema. Diretórios precisam terminar com '/' (trailing slash) e por padrão o apache adiciona automaticamente no final da URL, mas talvez você esteja usando uma regra para remover o trailing slash... algo assim:

 

 

RewriteRule (.*)/$ $1 [R,L]

 

É esse o caso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa condição não se aplicaria somente se a pasta n existisse? Pois o problema que esta acontecendo é que quando digito a URL por exemplo:

 

localhost/teste

 

e existe a pasta teste dentro de localhost, ele me retorna a url:

 

localhost/teste/?request=teste

Compartilhar este post


Link para o post
Compartilhar em outros sites
Com essa condição, a regra é aplicada apenas se a requisição aponta para uma pasta que NÃO existe. O ponto de exclamação antes do -d (d de diretório) serve para indicar negação.


Portanto o seguinte:


RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{REQUEST_FILENAME} !-d


Significa:


- Não aponta para um arquivo que existe OU
Aponta para um arquivo que termine por

- Não aponta para um diretório que existe


Apenas se essas condições forem satisfeitas a regra será executada.



Como eu disse antes, URLs para diretórios/pastas precisam terminar com '/' (trailing slash) e por padrão o Apache automaticamente adiciona isso a URL.


Portanto mesmo que você acesse...

localhost/teste


Você será redirecionado para...

localhost/teste/


E será exibido o index para o diretório /teste.


Parece que no seu caso alguma outra regra ou alguma outra configuração alterou esse comportamento padrão do Apache e ele não está adicionando '/' ao final da URL.


Tente o seguinte:


Faça um backup de seu .htaccess e crie outro com apenas esse conteúdo e veja se o problema persiste:



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]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois bem, esse é o comportamento correto.

 

 

Só mais uma coisinha:

 

Se você não quer que ele liste os arquivos, use:

IndexIgnore */*
Mas cuidado, isso não é uma proteção para impedir acesso indevido a um diretório, pois se o visitante souber o nome de um arquivo neste diretório, ele será capaz de acessá-lo.
Para proteger efetivamente um diretório e todos os arquivos e subdiretórios que ele contem, você precisa colocar o seguinte .htaccess neste diretório que você quer proteger:

 

 
Order Deny,Allow
Deny from all

Compartilhar este post


Link para o post
Compartilhar em outros sites

Surgiu a necessidade de criar um subdiretório na raiz www.

 

www/

www/admin

 

Quero que a regra:

 

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

 

Continue igual! Porem as requests que contiverem "admin", quero que faça o mesmo porem para o diretório "admin", ou seja:

 

RewriteRule ^admin/(.*)$ admin/index.php?request=$1 [L]

 

 

Só que dessa maneira não consegui fazer funcionar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putsss, agora que notei que com:

 

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]

 

As requisições ajax, dão problema :S

 

Solução??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite!

Estou com dificuldades de fazer com que algumas regras do htaccess sejam lidas. Podem ajudar?

 

Estou usando o seguinte código:

 

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^site.com.br$ [NC]
RewriteRule . - [E=REWRITEBASE:/]
RewriteRule ^api/?(.*)$ %{ENV:REWRITEBASE}webservice/dispatcher.php?url=$1 [QSA,L]
# Images
RewriteCond %{HTTP_HOST} ^site.com.br$
RewriteRule ^([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1-$2$3$4.jpg [L]
RewriteCond %{HTTP_HOST} ^site.com.br$
RewriteRule ^([0-9]+)\-([0-9]+)(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1-$2$3.jpg [L]
RewriteCond %{HTTP_HOST} ^site.com.br$
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]
RewriteCond %{HTTP_HOST} ^site.br$
RewriteRule ^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$1$2$3$4.jpg [L]
.
.
.
O problema é que o código está sendo lido até apenas até as linhas em vermelho. Quando na verdade eu precisava que fosse lido tanto as linhas em vermelho quanto as linhas em azul.
Pensei que se tirasse o [L] fosse funcionar mas não é isso, continua lendo apenas até as linhas em vermelho.
Obrigado

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.