Por que o htaccess deve ser evitado?

Postado por Yoshio Iwamoto em 11/02/2010

No post anterior falei sobre o htaccess, o que é, como funciona e mais algumas dicas. Porém faltou dar uma explicação melhor desta citação sobre quando utiliza-lo:

Por questões de performance e segurança: NUNCA!!!!!!!!!!!!11...

Então, por que devemos evitar o uso do htaccess?

Performance

Se você utiliza o htaccess em seus diretórios então o Apache terá que verificar pela existência do ".htaccess" no diretório atual e em cada diretório superior e carregar estas configurações em runtime a cada vez que as páginas são requisitadas.

Mesmo sem existir nenhum arquivo ".htaccess" ainda haverá pequeno impacto na performance pois o Apache sempre verifica a existência deste arquivo nos diretórios.

Para não utilizar o htaccess e evitar estas verificações desabilite o AllowOverride (AllowOverride None) nas configurações principais do Apache.

Segurança

Quanto a segurança isto depende se é você ou não quem configura os ".htaccess" e/ou o Apache.

Batendo novamente na tecla, o htaccess deve ser utilizado quando se necessita aplicar regras por-diretório e não se possui permissão para alterar as configurações do servidor (e reiniciar o apache também :) ).

Normalmente esta é uma situação encontrada nas hospedagens, você pode hospedar suas páginas mas não pode alterar as configurações do servidor. É ai que entra o htaccess.

Permitindo o uso do htaccess neste caso, você basicamente está permitindo que o "usuário" (uma pessoa que provavelmente você não conhece, seja de conhecimentos técnicos ou caráter) configure o seu próprio:

<Directory ...>
...
</Directory>

Mas de qualquer forma a questão da segurança depende mais da capacidade da pessoa que está configurando o servidor para não deixar que os usuários façam "caquinhas".

Hypertext Access: htaccess

Postado por Yoshio Iwamoto em 9/02/2010

O "Hypertext Access" ou apenas "htaccess" é um arquivo (oculto) com diretrizes de configuração do servidor HTTP Apache que são aplicadas por diretório.

Basicamente o htaccess utiliza a mesma sintaxe do arquivo de configuração principal do Apache, porém obedece as regras estabelecida pela diretriz AllowOverride.

Para utiliza-lo crie um arquivo ".htaccess" no diretório onde você deseja que as regras sejam aplicadas e adicione dentro dele as diretrizes. As regras são aplicadas sem a necessidade de reiniciar o Apache.

Quando utilizar?

Por questões de performance e segurança: NUNCA!!!!!!!!!!!!11...

Obviamente se o htaccess existe é porque há um motivo. Utilize nas seguintes condições:

  • Se sua hospedagem não permitir alterações nas configurações principais do Apache (permissão).
  • Se você precisar permitir que seus usuários possam alterar as configurações do Apache (ex: servidor compartilhado), mas com uma certa limitação (hospedagem é um bom exemplo novamente).

De toda forma evite o uso do htaccess.

Dicas

As dicas abaixo funcionam não só no ".htaccess", mas também no arquivo de configuração principal do Apache (onde é mais recomendável).

Algumas dicas podem necessitar do módulo Mod-Rewrite habilidado.

301 Redirect

O "301 redirect" é a melhor forma de ser fazer um redirecionamento de uma página, além de Search Engine Friendly.

Exemplo 1: Redirecionando todo o website para um outro domínio

Redirect 301 / http://outrodominio.com.br/



Exemplo 2: Redirecionando uma página específica

Redirect 301 /pagina_de.html http://dominio.com.br/pagina_para.html



404 Redirect

Redirecionando erros 404, o famoso "Page not found" (Página não Encontrada), para uma outra página.

ErrorDocument 404 /pagina_404_customizada.html



O mesmo vale para redirecionar outras página de erro como 403, 500 e 666. o.O

DirectoryIndex

A diretriz "DirectoryIndex" permite escolher uma lista de recursos/páginas/arquivos que serão retornados para a requisição de um index de diretório. Se o arquivo index não for especificado será feita a listagem do diretório (se for permitido).

Por padrão é procurado pelo "index.html" (ou index.php ou outras extensões mais caóticas).

Exemplo:

  • De http://seudominio.com.br/ para http://seudominio.com.br/index.html
  • De http://seudominio.com.br/diretorio/ para http://seudominio.com.br/diretorio/index.html
DirectoryIndex index.html index.txt index.exe


Negando listagem de diretório

Já que eu comentei, para não permitir a listagem de diretórios adicione o seguinte comando no htaccess.

Options -Indexes


Mudando extensões dos arquivos

Se você quiser migrar/trocar suas páginas *.html para *.php poderá utilizar o seguinte comando.

RedirectMatch 301 (.*)\.html$ http://www.seudominio.com.br$1.php



Só fique esperto com o uso de iframes ;)

Tradução do Google

Traduz o site automaticamente através do Google Translate. Este até que é interessante (apesar de ainda não ter pensado em como poderá ser útil) e encontrei hoje no site da Dreamhost.

Fiz alterações para que seja de Português para outros idiomas e aviso que ainda não testei.

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)-(en|es|it|jp|fr)$ http://www.google.com/translate_c?hl=$2&amp;sl=pt&amp;u=http://seudominio.com.br/$1 [R,NC]



Funciona da seguinte forma, quando alguém acessar "http://seudominio.com.br/-en" ele será traduzido de Português(pt) para Inglês(en) pelo Google Translate.

AccessFileName

Permite alterar o nome do arquivo htaccess (que por padrão é ".htaccess") para qualquer outra coisa como ".config". Esta diretriz na verdade deve ser utilizada no arquivo de configuração principal do Apache.

AccessFileName .config


Make e Makefile

Postado por Yoshio Iwamoto em 25/11/2009

Você que utiliza algum *nix da vida já deve ter passado pelo momento mágico de ter executado o comando make em algum código fonte, não?

O make (GNU make) é uma ferramenta que executa os comandos inclusos dentro de um arquivo. É normalmente utilizado na compilação e instalação de programas.

Uma das vantagens do make é que ele identifica quais partes do programa devem ser recompiladas de acordo com as mudanças efetuadas desde a última compilação.

Dependendo do tamanho do programa pode-se economizar minutos ou horas entre as recompilações, pois não será necessário recompilar o programa inteiro.

Exemplo de uso:

$ make -f arquivo_com_os_comandos

Se você chamar o comando make sem passar nenhum parâmetro ele tentará utilizar o arquivo com nome de Makefile do diretório atual.

É o que normalmente acontece quando você precisa compilar e instalar um programa pelo código fonte.

  • Descompactar o código fonte (se for um "*.tar.gz").
  • Entrar na pasta descompactada. Haverá um arquivo Makefile dentro.
  • Executar o comando "make" para compilar.
  • Executar o comando "make install" como root para instalar.

Makefile

Se você quiser utilizar o comando make só é necessário criar um arquivo Makefile e dentro dele colocar as instruções que o make deve executar.

Formato do Makefile:

regra: dependências...
	comandos
	...

Os comandos são comandos normais do shell (bash). Pode-se colocar vários comandos, porém devem estar identados com tabulações. Isto é importante, não utilize espaços pois não irá funcionar.

A regra é só um nome para identificar um bloco de comandos. Fazendo uma analogia com programação, a "regra" seria semelhante a uma função.

As dependências são os arquivos necessários para a execução dos comandos da regra, o make irá fazer a verificação deles. Também podem ser outras regras que serão chamadas antes da execução dos comandos. Se houver mais de uma dependência elas devem ser separadas com espaços.

Aqui vai um exemplo de um Makefile que compila um programa em C:

program:
	gcc -o meuprograma meuprograma.c

Um exemplo com dependências:

program: cod1.c cod2.c lib1.a
	gcc -c cod1.c cod2.c
	gcc cod1.o cod2.o lib1.a -o program

lib1.a: lib1.c cod3.c
	gcc -c lib1.c cod3.c
	ar rcs lib1.a lib1.o cod3.o
	ranlib lib1.a

Pode-se utilizar variáveis também. A declaração é simples, mas devem ser chamados com a notação "$(variável)". Repare também que elas podem ser concatenadas:

CC=gcc
CFLAGS=-O2
CFLAGS=$(CFLAGS) -Wall

program:
	$(CC) $(CFLAGS) -o program program.c

Olha que legal no Makefile a seguir, advinha o que acontece ao executar o comando `make clean' no terminal?

program: program.c
        gcc -o program program.c

clean:
        rm *.o
        rm program

O que aconteceria também se houvesse um arquivo no diretório atual que se chamasse "clean"? O `make clean' não iria executar a lista de comandos da regra. Para evitar este tipo de conflito utilize a regra ".PHONY":

program: program.c
        gcc -o program program.c

.PHONY: clean
clean:
        rm *.o
        rm program

Agora a regra "clean" será executada mesmo se houver um arquivo no diretório atual com mesmo nome.

Ordenação de tabelas com jQuery

Postado por Gabriel Verta em 12/11/2009

Em mais um post de jQuery, venho apresentar-lhes o plugin tablesorter. Este plugin ordena as colunas de uma tabela a partir do clique no cabeçalho da mesma:

No código, basta adicionar o javascript e o css do tablesorter, além da biblioteca jquery:

 
<html>
<head>
<link rel="stylesheet" type="text/css" href="tablesorter.css" />
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="jquery.tablesorter.js">
    </script>
    <script type="text/javascript">
        $(function(){
             $('.tablesorter').tablesorter()
         })
    </script>
</head>
<body>
<table class="tablesorter" cellspacing="1">
<thead>
<tr>
<th>first name</th>
<th>last name</th>
<th>age</th>
<th>total</th>
<th>discount</th>
<th>date</th>
</tr>
</thead>
<tbody>
<tr>
<td>peter</td>
<td>parker</td>
<td>28</td>
<td>$9.99</td>
<td>20%</td>
<td>jul 6, 2006 8:14 am</td>
</tr>
<tr>
<td>john</td>
<td>hood</td>
<td>33</td>
<td>$19.99</td>
<td>25%</td>
<td>dec 10, 2002 5:14 am</td>
</tr>
<tr>
<td>clark</td>
<td>kent</td>
<td>18</td>
<td>$15.89</td>
<td>44%</td>
<td>jan 12, 2003 11:14 am</td>
</tr>
<tr>
<td>bruce</td>
<td>almighty</td>
<td>45</td>
<td>$153.19</td>
<td>44%</td>
<td>jan 18, 2001 9:12 am</td>
</tr>
<tr>
<td>bruce</td>
<td>evans</td>
<td>22</td>
<td>$13.19</td>
<td>11%</td>
<td>jan 18, 2007 9:12 am</td>
</tr>
</tbody>
</table>
 
<body>
</html>
 



Na documentação oficial ainda, são listadas algumas das configurações possíveis, dentre as quais podemos destacar:

É isso ai ;)

Carrossel de imagens com jQuery

Postado por Gabriel Verta em 5/11/2009

Neste post venho mostrar-lhes outro bom plugin para jQuery, o jCarousel.
Com este plugin podemos fazer com que diversas imagens rodem em um espaço limitado tornando o layout mais amigável.

Vamos ao nosso primeiro exemplo de carrossel:

Para fazer um carrossel simples, como este, precisaremos dos arquivos de js e css da biblioteca jCarousel, além do css de skin do jCarousel a ser utilizado, e do js do jQuery. Segue o código:

 
<html>
<head>
<title>Carrossel simples com jQuery</title>
<link rel="stylesheet" type="text/css" href="css/style.css" />
<link rel="stylesheet" type="text/css" href="css/jcarousel.css" />
<link rel="stylesheet" type="text/css" href="css/tango-skin.css" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jcarousel.js"></script>
<script type="text/javascript">
$(function(){
    $('#carrossel').jcarousel()
})
</script>
</head>
<body>
<h1>jCarousel - Carrosel Simples</h1>
<ul id="carrossel" class="jcarousel-skin-tango">
<li><img src="img/imagem1.jpg" /></li>
<li><img src="img/imagem2.jpg" /></li>
<li><img src="img/imagem3.jpg" /></li>
<li><img src="img/imagem4.jpg" /></li>
<li><img src="img/imagem5.jpg" /></li>
<li><img src="img/imagem6.jpg" /></li>
</ul>
 
</body>
</html>
 



Este é o exemplo mais simples de utilização do jCarousel, existem várias outras variações deste através de opções passadas a ele. Dentre as funcionalidades podemos destacar:

;)

Python logging em Django

Postado por Rafael Sierra em 3/11/2009

Que o módulo logging e o framework Django são excelentes ferramentas pra qualquer trabalho todos sabem, mas como fazer para integrar os dois?

Eu sempre achei um saco o fato do Django não ter um módulo builtin/contrib que permitisse que ao fazer um simples logging.error('PAN!') a mensagem, a data, o nível, the universe and everything, fossem gravados no banco de dados. Pra resolver esse simples problema, nada como uma simples solução.

Solução
A Solução

Para começar crie um aplicativo em sua aplicação chamado "log", nunca crie a aplicação com nome de "logging", a não ser que você queira problemas com imports não funcionando:

python manage.py startapp log

Em seguida crie o seguinte model:

# -*- encoding: utf-8 -*-
from django.db import models
from django.contrib import admin
import logging
 
class Log(models.Model):
    level = models.IntegerField(db_index=True)
    file = models.CharField(max_length=512, db_index=True)
    lineno = models.IntegerField()
    date = models.DateTimeField(db_index=True)
    message = models.TextField()
 
    def _get_level_name(self):
        return logging.getLevelName(self.level)
    levelName = property(fget=_get_level_name)
 
    def _get_message_summary(self):
        if len(self.message) > 100:
            return '%s...'%(self.message[:100])
        else:
            return self.message
    messageSummary = property(fget=_get_message_summary)
 
    def _get_file_summary(self):
        if len(self.file) > 30:
            return '...%s'%(self.file[-30:])
        return self.file
    fileSummary = property(fget=_get_file_summary)
 
class LogAdmin(admin.ModelAdmin):
   date_hierarchy = 'date'
   list_display = ('level', 'levelName', 'date','messageSummary', 'fileSummary', 'lineno')
   list_filter = ('level',)
   search_fields = ('message', 'file')
 
admin.site.register(Log, LogAdmin)
 

Em seguida crie o arquivo "handler.py" dentro do aplicativo "log" com o seguinte conteúdo:

 
# -*- encoding: utf-8 -*-
import logging
import datetime
from SEUPROJETO.log.models import Log
 
class DjangoHandler(logging.Handler):
    '''Executa a manipulação do log e insere no banco de dados'''
    def emit(self, record):
        log = Log()
        log.level = record.levelno
        log.file = record.pathname
        log.lineno = record.lineno
        log.message = record.msg
        # TODO: Utiizar o record.created
        log.date = datetime.datetime.now()
        log.save()
 

Com isso você já tem tudo que precisa pra logar direto pro banco de dados, só falta uma coisa: Configurar o projeto para o logging usar nosso handler.

Pra fazer isso, edite o arquivo __init__.py (e você achando que esse arquivo era inutil :) e adicione o seguinte conteúdo ao arquivo:

 
import logging
from SEUPROJETO.log.handler import DjangoHandler
django_handler = DjangoHandler()
logging.root.addHandler(django_handler)
 

E pronto, é só correr pro abraço, todo e qualquer log que você executar vai ser armazenado no banco de dados.

Yes! Tudo que faltava pra terminar meu projeto!
Yes! Tudo que faltava pra terminar meu projeto!

... e antes que você venha me reclamar que a p0rr@ do log não ta aparecendo em lugar nenhum, verifique se você está usando o logging.debug com a configuração padrão do módulo logging (que só exibe mensagens de nível mais alto).

Em tempo: Eu sei que é extremamente simples criar um módulo/pacote com tudo isso, mas não seria tão didatico simplesmente falar "baixe aqui, copie ali e import lá".

Se você tiver interesse, sugira a implantação deste módulo ao django.contrib ;)

Agregador de redes sociais em PHP

Postado por Rafael Monteiro em 28/10/2009

Cenário

Atualmente temos uma diversidade de conteúdo espalhado sob diversas formas, seja através de fotos, comentários, tweets, blogs, links favoritos, etc. Como exemplo podemos citar as redes: Flickr, Last.fm e Twitter.

Não seria interessante agregá-los em uma página ?

Isso pode ser feito utilizando a classe SimplePie, de código aberto, fácil utilização, escrita em PHP e que nos ajudará a trabalhar com o RSS necessário para a manipulação dos dados.

Ela pode ser encontrada em: http://simplepie.org/downloads/.

Continue Lendo »

Slide de Imagens com jQuery

Postado por Ricardo Perez em 26/10/2009

Continuando a série de post sobre jQuery iniciado por Gabriel.

Hoje vou mostrar um pouco sobre Effects e alguns métodos interessantes do jQuery, Usando como exemplo um simples slide de Imagem.

Neste código vemos o effect FadeIn(efeito de aparecer) e fadeOut(efeito de desaparecer) e o método next
Continue Lendo »

Bordas arredondadas com jQuery

Postado por Gabriel Verta em 22/10/2009

Pulando um pouco a seqüência de posts anteriores, gostaria de mostrar-lhes o plugin Jquery Corner que cria bordas arredondas com o JQuery.

E como funciona?

Continue Lendo »

Envio de email utilizando a classe PHPMailer

Postado por Rafael Monteiro em 19/10/2009

Cenário

De início você pode estar pensando: "mas porquê vou incluir essa biblioteca se o PHP já possui a função mail() nativamente ?".

Através da classe PHPMailer, temos uma solução de envio de email mais robusta e com maiores funcionalidades, dentre elas a possibilidade de incluir anexos à mensagem, incluir CCs e CCOs, definir tamanho padrão para quebra de palavras (wordwrap) e utilizar um servidor SMTP, sendmail ou QMail para o envio.

O fato de podermos especificar como será feito o envio é particularmente útil no caso de hospedarmos uma aplicação em um ambiente que não possua um servidor de email integrado (cenário incomum mas que pode vir a ocorrer). Nesse caso, é possível, ainda, definirmos um host padrão para envio e um outro redundante, no caso de o primeiro falhar.

Onde encontrar

O download da biblioteca pode ser feito em: http://sourceforge.net/projects/phpmailer/files/.
Nesse endereço existem versões para o PHP 4 e PHP 5.

Continue Lendo »

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.