quinta-feira, 23 de outubro de 2008

Urls Amigáveis no PHP(Apache)

Mtas vezes o cliente ou o próprio programador deseja dar uma "enxugada" nas urls.
De modo que www.site.com?pagina.php?id=114&atr=nome&sessao=comentarios se torne algo como: www.site.com/comentarios/nome/114.


Para tanto nos usamos o mod_rewrite, o mod_rewrite é um módulo do servidor Apache que permite reescrevermos as urls.


Mas tem mais mnós não só reescrevemos elas como também tornamos imperceptível para o navegador,crawlers e spiders!


Nota: Crawlers e spiders são programas que vasculham a internet em busca de dados, com o google bot



Resumindo o artigo:
  • Para termos mod_rewrite devemos editar o .htacces que só deve ter esse nome e deve ficar na root do html;
  • Editando o htaccess devemos iniciar o mod_rewrite com RewriteEngine On;
  • Caso queiramos aplicar a regra apenas para alguns usamos RewriteCond;
  • Aplicamos a regra com RewriteRule REGEX Redirecionamento e Flags;
  • Usamos backreference que vem a ser o que a regex abriga para passar referência a pagina em si;
  • A Url fica imperceptível no lado cliente;
  • EXEMPLO Rápido:
    RewriteEngine On
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^(artigos)(\/(.+)?)?$ /indexArtigos.php?tipo=ver&artigoNome=$3 [L]
    RewriteRule ^(editarArtigos)(\/(.+)?)?$ /indexArtigos.php?tipo=editar&artigoNome=$3 [L]

  • Exemplo para fingir que php é html
    RewriteEngine On
    RewriteRule ^(.*)\.htm /$1.php[L]


Iniciando, o arquivo .htaccess


o arquivo .htaccess é um arquivo que tem apenas este nome, não é algo.htaccess é apenas .htaccess, este arquivo deve ficar na pasta raiz de seu servidor ex: htdocs,www,public_html etc. Para certos servidores vc já tem um arquivo .htaccess lá, se for o caso o edite mas evite de deletar informações a não ser que saiba exatamente o que elas fazem!


A sintaxe do .htacces para mod_rewrite


Abaixo explicarei apenas as coisas mais usadas para maiores informações : http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html



  • Habilite o mod_rewrite RewriteEngine On OU RewriteEngine Off caso decida desabilitá-lo

  • Se desejado coloque condições RewriteCond String-de-Test Padrão-da-condição

  • Coloque a regra em si : RewriteRule Padrão Substituição


A sintaxe RewriteEngine é auto explicativa, abaixo explico em detalhes RewriteCond e RewriteRule


RewriteCond

Define a condição para que o mod_rewrite funcione, podemos utilizar variáveis com a sintaxe %{NOME-DA-VARIAVEL} em que as variaveis disponiveis são:


Variaveis RewriteCond

HTTP_HEADERS HTTP_USER_AGENT ,HTTP_REFERER ,HTTP_COOKIE ,HTTP_FORWARDED ,HTTP_HOST ,HTTP_PROXY_CONNECTION ,HTTP_ACCEPT


connection & request:REMOTE_ADDR ,REMOTE_HOST ,REMOTE_PORT ,REMOTE_USER ,REMOTE_IDENT ,REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING ,AUTH_TYPE


server internals: DOCUMENT_ROOT ,SERVER_ADMIN ,SERVER_NAME ,SERVER_ADDR ,SERVER_PORT ,SERVER_PROTOCOL ,SERVER_SOFTWARE


system stuff: TIME_YEAR ,TIME_MON ,TIME_DAY ,TIME_HOUR ,TIME_MIN ,TIME_SEC ,TIME_WDAY ,TIME


specials:API_VERSION ,THE_REQUEST ,REQUEST_URI ,REQUEST_FILENAME ,IS_SUBREQ ,HTTPS


A maioria das variáveis são nativas do apache, já documentadas em outro lugar exceto as specials:



  • IS_SUBREQ: Contem true ou false se é um sub_request

  • API_VERSION Versão do Apache module API

  • THE_REQUEST a http_request completa enviada ao servidor ex: GET /index.html HTTP/1.1 Não inclui headers adcionais como coisas enviadas por um form

  • REQUEST_URI a URI por exemplo index.html

  • REQUEST_FILENAME caminho para o script dentro do server como c:\xampp\htdocs\index.html

  • HTTPS contem "on" ou "of" dependendo de se estar usando SSL/TLS


Vc pode colocar um ! na condição para especificar o que NÃO deve bater na expressão


Flags rewrite Cond


  • -d se é um diretório

  • -f se é um arquivo comum(ex: txt,xml etc..)

  • -s arquivo comum com tamanho maior que 0

  • -l Link Simbólico

  • -D se é um diretório(Via sub-request)

  • -F se é um arquivo comum(Via sub-request)


OR e AND em RewriteCond

Normalmente ao se colocar uma regra como:


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


Teriamsos a seguinte interpretação Se ele NÃO É um arquivo comum E não é um diretorio


Caso nós queiramos um ou basta colocar o seguinte


RewriteCond %{SCRIPT_FILENAME} !-f[OR]
RewriteCond %{SCRIPT_FILENAME} !-s


Nesse caso a regra se aplica pra arquivos que Não Sejam arquivos comuns OU sejam arquivos comuns com tamaho maior que zero


Exemplo:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepageMoz.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /homepageLynx.html [L]
RewriteRule ^/$ /homepageOther.html [L]


essa condição bate se o usuário estiver usando mozilla vai pra uma pagina, lynx outra e o resto outra, ficara mais claro quando explicarmos a RewriteRule


RewriteRule

A RewriteRule usa expressões regulares(Regex), caso não saiba pesquise no google, talvez num futuro próximo escreva um artigo sobre isso, por hora suponho que vc entenda Regex


Sintaxe Básica

RewriteRule ^(admin)(\/(\w+)?)?$ /adminArea/admin.php?pagina=$3


no caso acima utilizamos a seguinte regra quando o usuario digitar /admin ou /admin/QUALQUER-LETRA ele sera direcionado para a pagina /adminArea/admin.php?pagina=$3 com o conteudo na parte de texto indo para a variavel GET pagina. Isso é feito por backreferences em que o numero em $ indica o numero do que pegamos com a expressão no nosso caso ,em que $0 é a expressão todo $1 seria admin $2 seria admin/qlqr-letra e $3 qualquer-letra


Algumas flags interessantes para RewriteRule


  • F OU forbidden lança para uma pagina com o erro 403 exemplo:
    RewriteEngine On
    RewriteCond %{SCRIPT_FILENAME} -d
    RewriteRule ^.* /paginaProibida.php[F]
    OU
    RewriteCond %{SCRIPT_FILENAME} -d
    RewriteRule ^.* /paginaProibida.php[forbidden]
    O exemplo acima lança para qualquer Diretorio pra paginaProibida.php com o erro 403 enviado ao browser



  • L OU last não aplica mais regras como no exemplo
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
    RewriteRule ^/$ /homepageLynx.html [L]
    Que não passaria pras regras subsequentes

  • N ou next Repassa as regras para o inicio das regras agora com a url ja modificada pela ultima rewrite rule



É isso para maiores referências pesquise urls açucaradas,urls amigaveis ou vá na página do mod_rewrite http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

sábado, 18 de outubro de 2008

Tutorial RED5 Parte 2

Parte 2 Desenvolvendo aplicação Demo


Continuando o Tutorial vou ensinar a criar uma nova aplicação, para referência pode-se usar os tutorias do flashExtensions da ultima postagem http://www.flashextensions.com/tutorials.php O migration guide http://www.joachim-bauch.de/tutorials/red5/MigrationGuide.txt e o HOW TO build new applications http://www.joachim-bauch.de/tutorials/red5/HOWTO-NewApplications.txt


Para IDE eu sugiro o Eclipse mas se vc quiser criar na Unha(nesse caso te invejo ) ou usando NETbeans ou o que seja sinta-se a vontade


A forma mais simples de se criar uma aplicação e copiando outra, geralmente há a aplicação test, copia e renomeie para o nome que qusier neste caso usaremos o nome exemplo


Estrutura de pastas


Na pasta webapps estará todas as suas aplicações por hora


Cada aplicação Deve/pode ter a pasta WEB-INF e Streams(Pode ter outro nome como podemos ver em outro tutorial)


Na WEB-INF teremos nosso binários e fontes dentro da WEB-INF temos lib,src,classes


Na lib colocaremos qlqr jar de referência que necessitarmos


Na classes teremos nossos binários


Na src nossos fontes (.java)


Desenvolvendo o Red5 com eclipse



  • Copie a pasta webapps/test ou crie uma nova pasta com o nome da sua aplicação no nosso caso exemplo,dentro da pasta devemos ter a pasta WEB-INF.Na WEB-INF devemos ter as pastas classes,streams e lib

  • No eclipse selecione o workspace para ser webapps e crie um novo projeto a partir do existente na pasta da aplicação

  • Na pasta do seu projeto clique com o botão direito,build path >configure build path clique em libraries, add external jars e adcione o red5.jar

  • Ainda em configure build path clique em source e vá em Default output folder e coloque a pasta WEB-INF/classes

  • clique com o direito WEB-INF/src>build path e va em use as source folder ou em configure build path novamente e coloque o WEB-INF/src como source folder, o icone deverá mudar

  • Crie um novo package algo como br.com.exemplo e nesse package crie uma classe com o nome de TesteExemplo


Agora preparamos o PROJETO vamos preparar os arquivos



Arquivos importantes


web.xml Arquivo principal de configuração copie-o do teste
Mudaremos algumas coisas procure a parte que diz
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/test</param-value>
</context-param> e mude o test para exemplo isso dirá ao red5 como acessar nossa aplicação


red5-web.xml Esse arquivo é vital , uma leve adaptação dele será no futuro o que exportaremos para o tomcat, partes importantes dele são o bean com o id de web.scope e o bean com o id de web.handler


No bean web.scope nós temos coisas relevantes ao ACESSO a nossa aplicação, enquanto ela está rodando no red5 como um serviço podemos usar o arquivo red5-web.properties para estocar algumas variáveis(ainda não testei isso no Tomcat)


Caso optemos por usar variáveis nesse arquivo a referência a ela estará na parte do bean de id "placeholderConfig" onde o value é o caminho a apartir da nossa aplicação pro arquivo properties


Voltando ao web.scope nesta parte nos temos:


<property name="server" ref="red5.server" /> Referência ao servidor global do red5(não mecha)


<property name="parent" ref="global.scope" /> Escopo Pai normalmente é o global.scope


<property name="context" ref="web.context" /> Contexto desse escopo referencia o no com msm id


<property name="handler" ref="web.handler" /> Handler, ponto de entrada referência nó com o msm id


<property name="contextPath" value="${webapp.contextPath}" /> Nome de acesso da aplicação no nosso caso exemplo, o valor poderia ser "/exemplo" ou como está ${webapp.contextPath} nesse caso estamos puxando esse valor do red5-web.properties


<property name="virtualHosts" value="${webapp.virtualHosts}" /> Hosts de acesso novamente estamos referenciando o red5-web.properties são os servidores ao qual permitimos acesso a essa aplicação poderia ser por exemplo:
*,localhost, localhost, 127.0.0.1, localhost:1935


red5-web.properties Esse arquivo referênciado pela tag <bean id="placeholderConfig"> do red5-web.xml configura variáveis externas no nosso caso temos as variaveis contextPath e virtualHosts no caso, a sintaxe eh NOME_DA_VARIAVEL=VALOR e só, separe-as por new line , no nosso caso algo assim:


contextPath=/exemplo
virtualHosts= *,localhost, localhost, 127.0.0.1, localhost:1935


O bean de id web.handler diz onde está a classe que cuida das requisições(podemos ter services que seriam outras classes tbm mas por hora vamos apenas usar este handler) o atributo class diz onde está o caminho no package pra nossa aplicação por exemplo no nosso caso br.com.exemplo.TesteExemplo, e o atributo singleton diz se ele é um singleton(criado apenas uma vez) ou não



Agora podemos criar nossa aplicação estando tudo preparado


Desenvolvendo a aplicação propriamente dita


Na sua aplicação extenda org.red5.server.adapter.ApplicationAdapter provavelmente vc terá que exportar alguns jars que estarão em Red5/lib


Coloque um método público como soma do red5 algo como isso aqui:
public Double soma(Double num,Double outroNum){
return num+outroNum;
}


Terminamos a parte do servidor


Lado cliente da aplicação


Para os leigos em comunicação com servidor em flash nos usaremos a classe netConnection que fará uma conexão RTMP, que é o protocolo de acesso usado pelo Red5(tpo http,ftp,https etc), com o servidor abaixo o código comentado



nc = new NetConnection();//Cria o objeto
nc.connect("rtmp://localhost/exemplo");//Se conecta ao exemplo O nome que colocamos como acesso
nc.onStatus= function (obj){//Funcao que lida com a conexao
switch(obj.code){
case "NetConnection.Connect.Success"://Ao se conectar com sucesso chamamos o metodo
nc.call("soma", nc, 3.0, 2.5);
break;
default:
trace("Deu algum pal "+obj.code);
}
nc.onResult = function(obj) {
trace("Resultado: " + obj);//Recebemos o retorno do metodo deve imprimir 5.5
}


É isso ae qlqr duvida comentem, publicarei outras coisas sobre Red5 caso alguem leia ou peça

Tutorial RED5

Parte 1: Preparando o Terreno


Mto bem tentando retomar o blog que nunca foi realmente tomado e devolver alguma coisa pra comunidade de TI.


Vou tentar neste e nos próximos posts postar um tutorial de Red5


O que é o Red5?


Red5 é um servidorFlash server Open Source em JAVA que suporta:



  • Streaming Audio/Video (FLV e MP3)

  • Gravação de Client Streams (Só FLV)

  • Shared Objects

  • transmissão de stream ao vivo

  • AMF



Downloads


Primeiramente baixe o red5 em http://osflash.org/red5/red5downloads Tenha o JAVA 6 Instalado preferencialmente e por segurança baixe o ANT(Atualmente eu não preciso dele com Red50.7 no Windows XP)


Após baixar o ant coloque-o em uma pasta e SE quiser adicione ele nas variaveis de sistema


Munidos e Instalados de ANT,JAVA6 e Red5 vamos as variáveis


Variáveis de Ambiente


NO WINDOWS


Para setar qualquer variavel ou vá em Painel de Controle>Sistema>Avançado>Variaveis de Ambiente na área de váriavies de sistema clique em nova pra cada variável.


Ou vá no Prompt de comando


ANT


  1. Coloque ele onde bem Entender

  2. Adcione o caminho ate a pasta do ANT na variavel ANT_HOME

  3. No prompt digite algo como :set ANT_HOME=c:\ant

  4. TENHA CERTEZA DE NÃO SOBRESCREVER A VARIÁVEL PATH

  5. Adcione no FINAL de path o caminho até a pasta do bin dentro da pasta do ant

  6. No prompt de comando digite set PATH=%PATH%;%ANT_HOME%\bin



JAVA_HOME


  1. Encontre a pasta JDK no seu windows estará algo como C:\Arquivos de programas\Java\jdk1.6.0_05\

  2. Coloque esse valor na variável java_home no prompt digite set JAVA_HOME=C:\Arquivos de programas\Java\jdk1.6.0_05\


NO LINUX


ANT

No shell exporte as variáveis do ANT como dito acima



  1. export ANT_HOME=/usr/local/ant

  2. TENHA CERTEZA DE NÃO SOBRESCREVER A VARIÁVEL PATH

  3. export PATH=${PATH}:${ANT_HOME}/bin


Dependendo do linux os comandos serão



  1. setenv ANT_HOME /usr/local/ant

  2. TENHA CERTEZA DE NÃO SOBRESCREVER A VARIÁVEL PATH

  3. set path=( $path $ANT_HOME/bin )


JAVA_HOME


  • export JAVA_HOME=/usr/local/jdk-1.6.0.05

  • OU setenv JAVA_HOME /usr/local/jdk/jdk-1.6.0.05


Referência: http://ant.apache.org/manual/install.html


Se vc manja mais de inglês esse tutorial é fantástico pra td o que vou falar aqui: http://www.flashextensions.com/tutorials.php procure a aba do Red5 e mande bala