Como implementar a reescrita de URL no meu arquivo .htaccess?

17

Gostaria de reescrever um URL (Por quê? Veja esta pergunta .) Para que, em vez de os usuários verem endereços como

labouseur.com/course-compilers.html 

eles podem ver e usar simplesmente

labouseur.com/course-compilers

(Melhor ainda, talvez eu deva reestruturar isso para que seja cursos / compiladores.)

Estou usando um serviço de hospedagem compartilhada baseado em Linux para o meu site, por isso não tenho controle administrativo do servidor, mas tenho controle sobre o .htaccess. As referências que li online pareciam pouco claras para mim, então estou procurando um pouco de clareza e conselhos aqui.

Alan
fonte
Observe que isso não é algo que você faz apenas na configuração do servidor (.htaccess). O primeiro passo importante é alterar os URLs do seu aplicativo, caso contrário, você terá muitos redirecionamentos desnecessários (ou conteúdo duplicado).
MrWhite

Respostas:

13

Você pode remover .html dos arquivos do servidor e definir as configurações no htaccess para que elas sejam exibidas como arquivos html, mas provavelmente não é isso que você está procurando.

Faça isso :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html
Rizwan Kassim
fonte
Há mais complexidade aqui, especialmente se você estiver preocupado com problemas de conteúdo duplicado. Com a regra acima, suas páginas ainda estarão acessíveis a partir dos URLs antigos.
21710 JasonBirch
3

Primeiro, verifique se o apache possui o módulo e se ele é permitido nos arquivos .htacces e, em seguida, adicione:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

Seu exemplo exigiria

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

Para uma estrutura de diretório de nível único e

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

Para uma estrutura multinível.

Mas tenha cuidado

Se você tem a estrutura

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

As regras de reescrita nos .htaccessarquivos filhos serão relativas à pasta pai e você poderá entrar em algumas situações de loop de reescrita bagunçadas . Certifique-se de usar RewriteCondpara impedi-los de acontecer, se puder!

Aiden Bell
fonte
Você se importa de entrar em mais detalhes sobre esse último ponto (usando RewriteCond para interromper os loops)?
Travis Northcutt
2

Além das respostas acima, pode-se usar

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) Permite letras, dígitos com um hífen (-).

(.*) reescreverá cada solicitação independentemente, o que pode impotir outras regras a seguir, causando erro interno no servidor ao acessar.

Abhishek Gurjar
fonte
Seu RewriteRule padrão é uma melhoria em relação à resposta aceita para o exemplo específico dado na pergunta; no entanto, ele falhará em corresponder ao caso mais geral quando houver mais de um segmento de caminho, por exemplo. /path/to/course-compilers. Inclua o Lsinalizador para diminuir o impacto nas seguintes regras. Embora o (.*)padrão seja desnecessariamente geral, é improvável que cause problemas sérios, devido à condição que verifica o arquivo.
MrWhite 8/17/17
1

Você não precisa usar um arquivo .htaccess para fazer isso. Simplesmente estruture seus arquivos em diretórios e, em vez de usar "labouseur.com/course-compilers.html", apenas nomeie o arquivo index.html e coloque-o em um diretório chamado "course-compilers". Então, quando você aponta para esse diretório, o índice é exibido por padrão, mas não será exibido na URL. Então você pode simplesmente escrever seus links como "labourseur.com/course-compilers" e tudo ficará bem.

Não é necessário .htaccess.

Joel Glovier
fonte