Apache / Mod Rewrite
#1
Posted 19/06/2007, 10:34
Após um tempão ausente, estou de volta!
A dúvida hoje é a seguinte:
Estou utilizando em um pequeno portal, hospedado em host comum (compartilhado), o MOD REWRITE.
Criei então o arquivo .htaccess no diretório raiz e nele fiz o seguinte:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !/index.php
RewriteCond %{REQUEST_FILENAME} !/favicon.ico
RewriteCond %{REQUEST_FILENAME} !/robots.txt
RewriteCond %{REQUEST_FILENAME} !/img
RewriteRule ^/?.*/?$ /index.php [L]
Com isso, quando o visitante digitar qualquer endereço, internamente o Apache vai solicitar a página index.php (desde que não seja /favicon.ico ou /robots.txt bem como o próprio /index.php, senão entra em loop infinito, e a pasta img, onde estão as imagens e toda a pasta está acessível).
No index.php tem um script que pega o que o visitante solicitou e com isso monta a página do jeito que eu quero (pode ser utilizando includes, processando alguma função ou mesmo retornando um header() 404 Not Found quando o que o visitante digitou não existe.
Certo? Até aí tudo bem.
A dúvida mesmo é:
Por estar fazendo com que TODOS os acessos executem o script index.php, pode haver algum tipo de sobre carga ou problema para o servidor?
Qual seria um limite aceitável de requisições (pageviews) para que essa técnica rode sem problemas?
Isso porque a meta inicial é ter cerca de 500mil pageviews/mes, esperando cerca de 5milhões a médio prazo.
Existe alguma forma de projetar isso e prever quando poderá sofrer algum tipo de sobre carga?
Uma das "soluções" que pensei seria criar 10 ou 20 cópias do index.php (index1, index2, etc) e na hora de redirecionar no .htaccess fazer um sorteio entre essas cópias e assim a sobre carga poderia ser dividida entre os arquivos....
Se tudo isso não for necessário, ou seja, estou me preocupando a toa pois não vai sobrecarregar nada, agradeço se me avisarem....
Obrigado e saudações aos antigos membros e novos também!!
#2
Posted 21/06/2007, 04:42
E se puder me ajudar em uma dúvida, fico grato desde já.
Meu HTACCESS:
RewriteEngine on RewriteRule !.(gif|jpg|png|css|js|swf|xml|txt)$ index.php RewriteRule ^(.*)$ index.php?gx=$1
Ele de forma alguma ta dando pra colocar os CSS, imagens e etc, coloquei como link absoluto do http://localhost/estilo.css e também e não inclui.
Pois estou começando a usar o mod_rewrite ainda . ^^ .
Obrigado e abraços.
Edição feita por: lwirkk, 21/06/2007, 05:38.
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!
#3
Posted 21/06/2007, 11:46
Tive uma série de problemas assim quando comecei a utilizar... como a engine utiliza expressões regulares, sempre tem algum errinho bobo que passa despercebido, por isso tentei simplificar como viu acima.
Também existe uma série de comandos específicos para o Mod Rewrite, tem um site aqui com umas tabelas com todos os comandos, muito útil!!
http://www.ilovejack...te-cheat-sheet/
Outra coisa importante, no HTML defina corretamente a tag <base> pois não sei como está teu site, mas as vezes da pane essa mudança de endereços... a tag <base> já "trava" os caminhos....
Agora preciso saber até onde compromete o uso do Mod Rewrite, não pelo uso dele em si, mas pelo problema de requisitar sempre o script index.php (que no seu caso seria a mesma coisa).
#4
Posted 21/06/2007, 17:25
Obrigado pela resposta, e, irei dar uma olhada melhor nesta página porquê tem muita coisa mesmo.
Mas sobre pesar servidor só de requisitar o INDEX.PHP sempre não pesa muito no servidor, pesará muito mais se não sei se é o seu caso, se a URL solicitado será usada para pegar dados de um DB e incluir estes dados.
Mas se a URL solicitada for incluir arquivos ou dados de arquivos já criados ficará bem acessível.
Mas se fosse o caso um VPS seria de um bom custo/benefício se for ter os pageviews que você pretende ter no futuro.
Ou DEDICADO caso não tenha preocupação com o dinheiro.
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!
#5
Posted 21/06/2007, 18:43
Voltando ao script:
Quando qualquer página é requisitada, o Apache chama o index.php, conforme citei.
Dessa forma, consigo ter um controle total sobre o acesso, posso até gravar logs para montar estatísticas, utilizar "paginas virtuais" (que não existem, como em um sistema de noticias por exemplo sem usar querystring), enfim, dá para fazer tudo.
A idéia inclusive é que o script processe qualquer tipo de arquivos, por exemplo, se for uma imagem JPG, o index abre o arquivo, cria os logs que eu quero e retorna o conteudo do arquivo com header() para tipo JPG.
Dessa forma TUDO vai ser processado pelo index... nessa hora que entra minha preocupação, por exemplo, uma página que tenha 10 imagens, vão se, no mesmo instante, pelo menos 11 chamadas ao script... imagina isso vezes mil ou milhão, sei lá....
Sendo que alguns tipos de chamadas consultam o MySQL, outras apenas pegam arquivos nos diretórios e mostram o conteúdo... e outras abrem arquivos e gravam os dados
Edição feita por: Alexx Ares, 21/06/2007, 18:44.
#6
Posted 21/06/2007, 19:07
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!
#7
Posted 21/06/2007, 20:24
#8
Posted 22/06/2007, 04:41
E se não for muito incomodo estou com um problema. ^^.
Se eu não coloco: RewriteCond %{REQUEST_FILENAME} !-f ou RewriteCond %{SCRIPT_FILENAME} !-f
Eu colocando $url[0] ou qualquer outro número na array ele só exibe o nome do arquivo INDEX.PHP por exemplo e não o que está na URL, se eu coloco um dos dois acima ali citados ai sim a array funciona normalmente senão ele volta a exibir somente INDEX.PHP .
Sabe me dizer porquê? Obrigado desde já.
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!
#9
Posted 22/06/2007, 09:46
#10
Posted 22/06/2007, 13:40
PHP:
$url = explode('/', $_GET['gx']);
HTACCESS:
RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-*.(css|js|txt|jpg|png|xml|php4)$ RewriteRule ^(.*)$ index.php?gx=$1
Explicação do -f:
RewriteCond %{SCRIPT_FILENAME} !-f Não aplica a condição para arquivos
No caso se eu colocar este -f, ficando assim:
RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-*.(css|js|txt|jpg|png|xml|php4)$ RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^(.*)$ index.php?gx=$1Eu acessando normal um diretório tal como: localhost/teste/teste1/
ele lê normal para o INDEX, e se eu colocar no PHP "echo $url[0]" ele mostrará "teste" normalmente, mesmo dentro da pasta real de "teste1" havendo um arquivo index.php ...
Mas... Se eu acessar localhost/teste/teste1/index.php , havendo o -f como dito acima ele deixa acesso normal, ou seja abre este arquivo normalmente sem mandar para o INDEX.PHP , mas se eu tirar o -f ele manda para o INDEX.PHP , porém quando pede no PHP $url[0] (teste) ou $url[1] (teste1) ele só mostra escrito INDEX.PHP e mesmo eu acessando: localhost/teste/teste1/ e se não tiver o -f ele mostrará escrito no array $url[0] ... mostrará escrito INDEX.PHP , porém eu não quero que uma pessoa tente acessar localhost/teste/teste1/index.php diretamenete e abra este arquivo, para não dar "BUG" de só mostrar na array escrito INDEX.PHP tem que colocar -f , mas colocando o -f ele libera acesso normal para todos arquivos diretamente.
Como faço para no caso ele enviar tudo para a INDEX.PHP mas sem dar BUG no array de só mostrar escrito INDEX.PHP ?
Obrigado desde já e desculpe se escrevi muito, tentei explicar ao máximo.
PS.: Mesmo requisitando sempre um arquivo com MOD_REWRITE acho que não pesa tanto, pois em fórum como o IPB por exemplo ele acredito que sempre requesita o INDEX.PHP . Claro o IPB é pesado de qualquer forma, mas esse na HOSTNET por exemplo fica bem rápido de se mecher.
Edição feita por: lwirkk, 22/06/2007, 13:44.
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!
#11
Posted 22/06/2007, 17:15
.htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !/admin/
RewriteCond %{REQUEST_FILENAME} !/index.php
RewriteCond %{REQUEST_FILENAME} !/favicon.ico
RewriteCond %{REQUEST_FILENAME} !/robots.txt
RewriteRule ^/?.*/?$ /index.php [L]
Teoricamente, tudo exceto os arquivos index, favicon, robots e a pasta "admin" tem acesso liberado, o resto chama o index.php.
Porém, ao acessar apenas "site.com/admin" ou seja, sem "/" ou sem o "/index.php" dá pau e as vezes entra em loop infinito.
Tentei usar uma série de expressões na condição, com / no fim, sem, com .* etc... e nada, piorava a situação.
Engraçado que no meu servidor local roda perfeitamente, o problema só ocorre quando mando pro servidor (no caso a Locaweb). Vendo o PHP info, percebi que lá é Apache 2.x sendo que o meu local é 1.x... ou seja, alguma incompatibilidade com a versão do Apache, certo?
A solução foi, no index.php da raiz, ao verificar o que o usuario requisitou com REQUEST_URI, se tiver "admin" após a primeira barra eu redireciono com o header() "Location" para admin/index.php
Sacanagem, pois isso acaba gerando um erro 302 de redirecionamento...
Agora tem duas coisas que não testei: instalar o apache 2.x aqui no localhost pra testar e estudar esse lance do -f e -d que eu nãu utilizei ainda... pode ser que forçando de alguma forma funcione!
#12
Posted 22/06/2007, 17:29
Edição feita por: lwirkk, 23/06/2007, 16:49.
"Se quiser ser feliz por um dia, vingue-se; se quiser ser feliz por uma vida inteira, perdoe."
Muito Obrigado à todos do fórum, e à toda equipe do fórum!
#13
Posted 08/07/2007, 22:54
Concluindo, acredito que não haverá um desgaste muito grande ao fazer com que TODAS as solicitações do site sejam feitas por um unico arquivo (index.php), sejam elas paginas php, html ou imagens, css, js, etc., desde que não sejam utilizados processos como consultas a BD e coisas que consomem muita memoria.
Um simples file_get_contents e um header com o tipo do arquivo, já retorna o arquivo que você quer, e qualquer coisa que queira gravar (algum log por exemplo) faça em um arquivo de texto com fopen e depois crie um script para ler isso e passar para o BD, em um outro momento.
Estou fazendo isso, por enquanto está tudo ok, toda solicitação do visitante, seja pagina ou imagens ou qualquer outro arquivo passam pelo index.php que antes de retornar o conteudo grava um log de acesso ao arquivo e outras informações que eu quero no sistema em um log.txt
Se alguem tiver alguma dicar para otimizar esse processo ou tenha uma experiencia ou referencia de que isso é errado, favor avisar!
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)