← Desenvolvimento

URL's amigáveis com .htacess

Lida 7815 vezes

Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Estava a usar no meu site as páginas da seguinte maneira: meusite.com/sobrenos.php
Agora tirei a terminação (.php) e tenho meusite.com/sobrenos, usei o seguinte no .htacess:
Código: [Seleccione]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^([a-z])$ $1.php
</IfModule>

Queria usar meusite.com/sobre-nos, por isso criei o ficheiro sobre-nos.php, mas ao aceder meusite.com/sobre-nos, dá o erro 404 - Não encontrado

Presumo que seja porque no htacess só está a regra só para letras, como pode adicionar também os -?

EDIT:
Queria também saber como faço para quando alguém entrar em meusite.com/pagina.php ser redireccionado automaticamente para meusite.com/pagina

 :obrigado:
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Alguém?

EDIT:
Consegui com isto:
Código: [Seleccione]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^([^.]+)$ $1.php
</IfModule>

Agora falta a última questão:
Citar
Queria também saber como faço para quando alguém entrar em meusite.com/pagina.php ser redireccionado automaticamente para meusite.com/pagina
Offline

rick171br 
Membro
Mensagens 179 Gostos 0
Feedback +4

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Se não forem muitas páginas você pode fazer diretamente na página:

Código: [Seleccione]
<?php
Header
"HTTP/1.1 301 Moved Permanently" );
Header"Location: http://www.meusite.com/pagina/" );
?>


Sobre a expressão regular, acho que também funcionaria assim:

Código: [Seleccione]
RewriteRule ^(\S+)$ $1.php
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Se não forem muitas páginas você pode fazer diretamente na página:

Código: [Seleccione]
<?php
Header
"HTTP/1.1 301 Moved Permanently" );
Header"Location: http://www.meusite.com/pagina/" );
?>

Não dá porque as páginas são as mesmas, só muda a url :lol:
Offline

rick171br 
Membro
Mensagens 179 Gostos 0
Feedback +4

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Olhando com mais calma, acho que o que você está querendo fazer pode criar uma espécie de loop infinito, já que você irá dizer para o servidor que quando receber por exemplo "pagina.php" ele tem que direcionar para "pagina" só que você também tá dizendo no .htaccess que quando chegar "pagina" "redirecionar" internamente para "pagina.php".

Acho que só alguma coisa rodando no cliente não causaria esse loop.

Se você quiser pode testar o script que fiz abaixo:

Código: [Seleccione]
<head>
<script language="javascript" type="text/javascript">
//alert(document.URL);
url = document.URL.split('.');
//alert(url.length);
if (url.length == 2){
//alert(url[0]);
top.location.href=url[0];
}
</script>
</head>
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Olhando com mais calma, acho que o que você está querendo fazer pode criar uma espécie de loop infinito, já que você irá dizer para o servidor que quando receber por exemplo "pagina.php" ele tem que direcionar para "pagina" só que você também tá dizendo no .htaccess que quando chegar "pagina" "redirecionar" internamente para "pagina.php".

Acho que só alguma coisa rodando no cliente não causaria esse loop.

Se você quiser pode testar o script que fiz abaixo:

Código: [Seleccione]
<head>
<script language="javascript" type="text/javascript">
//alert(document.URL);
url = document.URL.split('.');
//alert(url.length);
if (url.length == 2){
//alert(url[0]);
top.location.href=url[0];
}
</script>
</head>
Que faz isso ao certo?
Offline

rick171br 
Membro
Mensagens 179 Gostos 0
Feedback +4

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Ele redireciona de "meusite.com/pagina.php" para "meusite.com/pagina" só que já vi um erro nele, pois se passar para ele "meusite.com" ele vai tentar redirecionar para "meusite".

Para resolver isso é só incluir mais alguns IFs.

Código: [Seleccione]
<script language="javascript" type="text/javascript">
//alert(document.URL);
url = document.URL.split('/');
//alert(url.length);
if (url.length > 1){
//alert(url[url.length-1]);
pagina = url[url.length-1].split('.');
if (pagina.length > 1)
{
//alert(pagina[0])
top.location.href=pagina[0];
}
}
</script>
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Ele redireciona de "meusite.com/pagina.php" para "meusite.com/pagina" só que já vi um erro nele, pois se passar para ele "meusite.com" ele vai tentar redirecionar para "meusite".

Para resolver isso é só incluir mais alguns IFs.

Código: [Seleccione]
<script language="javascript" type="text/javascript">
//alert(document.URL);
url = document.URL.split('/');
//alert(url.length);
if (url.length > 1){
//alert(url[url.length-1]);
pagina = url[url.length-1].split('.');
if (pagina.length > 1)
{
//alert(pagina[0])
top.location.href=pagina[0];
}
}
</script>
Está a funcionar, obrigado.

Isto é SEO Friendly?
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Tenho um script a funcionar noutra pasta do site, e que tem urls do tipo meusite.com/index.php?L=blabla

E ao aceder ao script dá erro 404 :-#
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Não testei, mas penso que isto resolve os teus problemas (os iniciais pelo menos):
Código: [Seleccione]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^pagina\.php$ /pagina [L,R=301]
RewriteRule ^([A-Za-z0-9-]+)$ /$1.php [L,NC]
</IfModule>
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Não testei, mas penso que isto resolve os teus problemas (os iniciais pelo menos):
Código: [Seleccione]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^pagina\.php$ /pagina [L,R=301]
RewriteRule ^([A-Za-z0-9-]+)$ /$1.php [L,NC]
</IfModule>
Isso é para tirar o .php certo? Isso já  tenho a funcionar e agora estou a ter o problema referido acima.
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Isso é para fazer tudo que pediste no primeiro post e em principio esta a funcionar sem problemas.
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Isso é para fazer tudo que pediste no primeiro post e em principio esta a funcionar sem problemas.
Obrigado Nazgulled! :)
Também reencaminha o .php para o sem .php?
Offline

Nazgulled 
Membro
Mensagens 552 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Não percebi...

Aquilo só tem duas regras, onde faz as duas coisas que pediste, pelo que eu percebi...

A primeira regra redirecciona "/pagina.php" para "/pagina" e se esta regra for usada, as regras seguintes serão ignoradas (evitando um ciclo infinito com a regra de baixo). A segunda apanha qualquer coisa que seja válido num URI (a regra que usaste inicialmente apanha TUDO e TODO o tipo de caracteres, o que não faz sentido) e redirecciona (internamente, ou seja de forma transparente sem o utilizador dar por isso) para a respectiva página .php, ou seja, "/sobrenos" vai para "/sobrenos.php" (mais uma vez, de forma transparente).

Não é só isto que queres?
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Não percebi...

Aquilo só tem duas regras, onde faz as duas coisas que pediste, pelo que eu percebi...

A primeira regra redirecciona "/pagina.php" para "/pagina" e se esta regra for usada, as regras seguintes serão ignoradas (evitando um ciclo infinito com a regra de baixo). A segunda apanha qualquer coisa que seja válido num URI (a regra que usaste inicialmente apanha TUDO e TODO o tipo de caracteres, o que não faz sentido) e redirecciona (internamente, ou seja de forma transparente sem o utilizador dar por isso) para a respectiva página .php, ou seja, "/sobrenos" vai para "/sobrenos.php" (mais uma vez, de forma transparente).

Não é só isto que queres?
Obrigado pelo script, mas já tenho um em uso e não o teu está a redireccionar e eu prefiro que fique mesmo sem o .php. Obrigado na mesma!

O que eu quero agora é limitar esta regra para o public_html, pois está a criar problemas com um script como disse aqui:
Tenho um script a funcionar noutra pasta do site, e que tem urls do tipo meusite.com/index.php?L=blabla

E ao aceder ao script dá erro 404 :-#