Jump to content
AndreLC

Ajuda no .htaccess

Recommended Posts

AndreLC

Boa tarde a todos,

Estou a usar o mod_rewrite no apache para reescrever URL amigáveis. Tenho duas dúvidas.

A primeira é que escrevi as regras para retirar a extensão do ficheiro (.html e .php) e de facto se colocar na URL http://www.meusite.com/pesquisa está a funcionar. Mas no html tenho as páginas a apontarem para a pesquisa.html.

O que queria era que sem mudar no html em vez de http://www.meusite.com/pesquisa.html ir directo para http://www.meusite.com/pesquisa (sem a extensão). Tentei

RewriteRule ^pesquisa$  pesquisa.html [R=301,L]

como está em comentário, mas sem sucesso. O que posso fazer?

A minha segunda dúvida é como estou a reescrever ali a regra com a página visualiza_imovel.php?id=98 (por exemplo) a página ficar http://www.meusite.com/visualiza_imovel/98 e se colocar na URL aparece a página mas sem as imagens, css e js. Sei que como coloquei visualiza_imovel tenho que recuar um nível, mas não quero recuar um nível em todas as páginas php ou colocar o endereço completo. Então tentei fazer como está em comentário, mas não está a resultar. O que também posso fazer para que fique bem?

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

#RewriteRule ^pesquisa$  pesquisa.html [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

RewriteRule ^imovel/([0-9]+)    visualiza_imovel.php?id=$1

#RewriteRule ^imovel/area/img/(.*)$ area/img/$1
#RewriteRule ^imovel/css/(.*)$ css/$1
#RewriteRule ^imovel/js/(.*)$ js/$1

Obrigado pela ajuda.

Cumprimentos,

AndreLC


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

Boa tarde,

Ando às voltas com este .htaccess. Precisava que alguém desse um olho aí nas duas dúvidas, por favor.

Obrigado.

Com os melhores cumprimentos,

AndreLC


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
HappyHippyHippo

porque esta conversão ?? :

xpto.html?a=23 >> xpto/23

porque não :

xpto.html?a=23 >> xpto?a=23

desta forma não perdes os argumentos do request ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mjamado

porque esta conversão ?? :

xpto.html?a=23 >> xpto/23

porque não :

xpto.html?a=23 >> xpto?a=23

desta forma não perdes os argumentos do request ...

Os motores de busca não são grandes fãs de query strings; além disso (e o objectivo até deve ser mais esse), é mais fácil decorar xpto/23 do que xpto?a=23 (embora fosse ainda mais fácil decorar xpto/slugItem23).

AndreLC, quando à primeira dúvida, não tens hipótese, tens mesmo de mudar o HTML. Ou então podes forçar o redirect (como tinhas em comentário, mas não funcionava porque entrava em conflito com as outras regras), mas aí estás a penalizar o utilizador (que tem de passar por dois pedidos) por causa de um erro teu. Muda o HTML.

Quanto à segunda dúvida, a resposta é caminhos absolutos. Começa os caminhos para imagens, CSS e JS sempre por uma "/", que indica a raiz do site, e o resto do caminho completo.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
AndreLC

porque esta conversão ?? :

xpto.html?a=23 >> xpto/23

porque não :

xpto.html?a=23 >> xpto?a=23

desta forma não perdes os argumentos do request ...

Seria no sentido que o mjamado referiu, simplificando depois na leitura pelos motores de busca.

Os motores de busca não são grandes fãs de query strings; além disso (e o objectivo até deve ser mais esse), é mais fácil decorar xpto/23 do que xpto?a=23 (embora fosse ainda mais fácil decorar xpto/slugItem23).

AndreLC, quando à primeira dúvida, não tens hipótese, tens mesmo de mudar o HTML. Ou então podes forçar o redirect (como tinhas em comentário, mas não funcionava porque entrava em conflito com as outras regras), mas aí estás a penalizar o utilizador (que tem de passar por dois pedidos) por causa de um erro teu. Muda o HTML.

Quanto à segunda dúvida, a resposta é caminhos absolutos. Começa os caminhos para imagens, CSS e JS sempre por uma "/", que indica a raiz do site, e o resto do caminho completo.

Bem me parecia que não teria hipótese e alterar no HTML, mas e se, por exemplo, apagarem o ficheiro .htaccess? Os links deixarão de fazer a ligação e deixarei de ter links no site... Perguntei no sentido de proteger o HTML. Então sendo assim tenho de proteger o .htaccess. Como o protego?

Exacto, com caminho absoluto, mas aqui não dá para aplicar com o RewriteRule?

Obrigado.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
mjamado
Bem me parecia que não teria hipótese e alterar no HTML, mas e se, por exemplo, apagarem o ficheiro .htaccess? Os links deixarão de fazer a ligação e deixarei de ter links no site... Perguntei no sentido de proteger o HTML. Então sendo assim tenho de proteger o .htaccess. Como o protego?

Mais depressa te apagam um HTML do que um .htaccess... De quem é que tens medo que te apague ficheiros?

Exacto, com caminho absoluto, mas aqui não dá para aplicar com o RewriteRule?

Dar, dar, dá sempre. Mas é absurdo. Os caminhos para conteúdos estáticos são sempre completos.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
AndreLC

Mais depressa te apagam um HTML do que um .htaccess... De quem é que tens medo que te apague ficheiros?

A minha questão veio devido ao facto de não ser o único a colocar os ficheiros no FTP. Sendo assim como protego ou o html/php ou o .htaccess ou ambos?

O site possui mesmo bastantes páginas em html e php, vou ter mesmo que mudar um a um? Deixei que esta fosse uma das últimas tarefas a fazer porque pensei que poderia contornar com o .htaccess, mas já percebi que deve ser das primeiras tarefas.

Dar, dar, dá sempre. Mas é absurdo. Os caminhos para conteúdos estáticos são sempre completos.

Percebido.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
mjamado

A minha questão veio devido ao facto de não ser o único a colocar os ficheiros no FTP. Sendo assim como protego ou o html/php ou o .htaccess ou ambos?

A menos que sejam vários utilizadores FTP diferentes, com os jails devidamente configurados, não é possível. Isso é daquelas coisas que não pode acontecer. As pessoas duma equipa de development devem ter rotinas para não andarem a pisar os pés umas das outras.

O site possui mesmo bastantes páginas em html e php, vou ter mesmo que mudar um a um? Deixei que esta fosse uma das últimas tarefas a fazer porque pensei que poderia contornar com o .htaccess, mas já percebi que deve ser das primeiras tarefas.

Um find and replace com uma expressão regular, cautelosamente, deve resolver o problema.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
AndreLC

A menos que sejam vários utilizadores FTP diferentes, com os jails devidamente configurados, não é possível. Isso é daquelas coisas que não pode acontecer. As pessoas duma equipa de development devem ter rotinas para não andarem a pisar os pés umas das outras.

A questão é que é um único acesso FTP para várias pessoas. Pois, lá está sou totalmente de acordo, só que por vezes não é bem assim que acontece na rotina no trabalho laboral. Deste modo, quero salvaguardar o trabalho que faço para chegarem ali e desfazerem tudo.

Um find and replace com uma expressão regular, cautelosamente, deve resolver o problema.

Obrigado mjamado.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

Como referiste que se podia apagar mais depressa um html, fiquei interessado no que posso fazer então para prevenir essa situação?

Obrigado.

Com os melhores cumprimentos,

AndreLC


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
mjamado

Como referiste que se podia apagar mais depressa um html, fiquei interessado no que posso fazer então para prevenir essa situação?

Não há nada a fazer. Se o utilizador de FTP é o mesmo, tem permissões para as mesmas coisas. Impossível proteger. Para a máquina, é como se fosse a mesma pessoa.

E as máquinas, para já, não conseguem controlar a burrice.

Só disse que era mais fácil apagar um html que um .htaccess porque, nalguns clientes FTP, os ficheiros que começam por ponto não aparecem.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
AndreLC

Percebi.  Só uma questão aí com os caminhos absolutos:

Que aconselhas?

Colocar, por exemplo, no ficheiro de config.php que tem os dados de acesso à BD uma variável com o link http directo do site

$link = "http://www.site.pt/";

e depois utilizar, por exemplo, em:

<a href="<?php echo $link ;?>contactos" target="_self">Contactos</a>

ou

com a raiz como tinhas referido e depois o resto do caminho?

<a href="/contactos" target="_self">Contactos</a>

Ou vai dar ao mesmo? Só para perceber.. Como normalmente utilizo sempre tudo como relativo.. Daí a questão.

E só para ver se estou a fazer bem:

Como tenho a regra:

RewriteRule ^imovel/([0-9]+)    visualiza_imovel.php?id=$1

Depois na hiperligação, neste caso, coloco assim?

echo "<a href='imovel/$id' target='_self'><img src='/area/img/Imoveis/$Imagem1' alt='' /></a>";

Obrigado.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
mjamado

Usa sempre os caminhos a começar por uma barra, efectivamente qualificando-os como começando na raiz - qualificar com o domínio parece-me excessivo, mas pode ser necessário nalguns casos...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
AndreLC

Ok, e na regra, estou a passar bem depois na hiperligação, fazendo "imovel/$id" ou com a barra da raiz atrás "/imovel/$id", mas na regra já teria que por a barra também não é? Só para perceber como fazer correctamente. (editei o post em cima).

Uma questão que em termos de organização queria perceber se é a única maneira de fazer ou estou a proceder incorrectamente - é que primeiro costumo sempre trabalhar em localhost e posteriormente é que passo para o servidor:

Então em servidor, tudo bem. Se puser na hiperligação: /css -> não dá problemas (como a pasta raiz é a httpdocs ou public_www e de seguida coloco os ficheiros do site), mas

Em localhost (uso o wamp) se puser /css ele não vai buscar nada porque a pasta raiz é a www e eu tenho organizado o meu www por pastas com os vários sites, então teria que ter /pasta_do_site/css, mas no servidor não quero a pasta_do_site porque não coloco lá essa pasta e queria que tanto em localhost como em servidor estivessem os caminhos iguais. Aqui o que vejo é que teria de retirar os ficheiros da pasta_do_site e colocar mesmo na pasta www para que ficasse certo.. É que assim, cada vez que quero ver o site em localhost tenho que o retirar da pasta_do_site e colocar na www.

É a única maneira de assim os caminhos estarem ambos correctos ou estou a ver mal?

Obrigado.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

Precisava que dessem uma vista de olhos no post anterior.

Obrigado pela ajuda e atenção.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

Share this post


Link to post
Share on other sites
AndreLC

Ok, estive a ver como podia fazer isto dos caminhos absolutos tanto localmente como em servidor e vi a opção que mais se justificava (mas que não funciona):

Com o $_SERVER['DOCUMENT_ROOT'], mas não resolve o problema porque aparece no caminho:

/var/www/vhosts/dominio/httpdocs/

Então o que estou a fazer é:

Se estiver a trabalhar localmente:

define('ROOT_DIR', '/Site/'); // Root folder

E no FTP mudo para:

define('ROOT_DIR', '/'); // Root folder

E, por exemplo:

<link href="<?php echo ROOT_DIR ;?>css/template.css" rel="stylesheet" type="text/css" />

Ou seja, aqui cada vez que quero passar para o FTP tenho que retirar o nome da pasta do site.

Não há nenhuma maneira mais eficiente que obtenha logo o caminho absoluto de maneira correcta?

Obrigado.


echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";

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

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.