Regra de Reescrita para adicionar a extensão .html

Eu preciso de uma regra que irá adicionar uma extensão .html sempre que houver ‘não’ uma barra final.

Recentemente, um novo cliente alterou os scripts de comércio eletrônico e a nova versão trata o SEO de maneira diferente e mudou todos os seus mais de 16.000 links de produtos. Isso não foi detectado antes de o site ser indexado novamente. Por isso, precisamos redirect o antigo para o novo.

Todos os produtos costumavam ter links como este domain.com/category/productname, mas agora são domain.com/category/productname.html

Links de categoria não mudaram e todos são como este domain.com/category/ (com barra final)

A resposta de @ david-wolever redireciona tudo o que não termina em .html (ou a raiz) para a mesma URL com uma extensão .html adicionada, o que significa que acrescenta uma extensão .html a coisas como arquivos CSS e JavaScripts, por exemplo, redirecione /style.css para /style.css.html, o que não é provável o que você deseja. Também tem os espaços depois! personagem que provavelmente causou @greggles 500s

Isso redireciona URLs que não terminam em um ponto seguido por 3 ou 4 caracteres alfanuméricos:

RewriteEngine On RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{3,4} RewriteCond %{REQUEST_URI} !/$ RewriteRule ^(.*)$ $1.html 

Ou, para um controle de granularidade mais refinado, coloque na lista de permissions as extensões que você não deseja .html anexadas a, por exemplo,

 RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif)$ 

Esta opção é semelhante à do @ remco, mas não requer o uso de [R] (um redirecionamento “externo” enviado de volta ao navegador). Eu também adicionei um missing \ na primeira condição:

 Options FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_URI} !^.*\.html$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html 
 RewriteEngine On
 RewriteCond% {REQUEST_URI}!  \ .html $
 RewriteCond% {REQUEST_URI}!  / $
 RewriteRule ^ (. *) $ $ 1.html

Você pode querer jogar um [R] lá, ou algo assim. Veja docs: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule (procure por “redirect | R”).

Este é um tópico antigo, mas ainda vale postar uma resposta de trabalho / teste para este problema:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+?)/?$ /$1.html [L,R=302] 

Condição de RewriteCond %{REQUEST_FILENAME} !-f ignorada, pois o padrão regex não está combinando nenhum URI com ponto nele.

A resposta de @ paul.grov.es parecia funcionar bem para mim, mas depois percebi que o meu javascript não estava funcionando mais.

A solução é óbvia, e mencionada por ele: um ‘.html’ estava sendo adicionado ao URL, já que a extensão do javascript tem apenas 2 caracteres.

Então, minha solução acabou sendo:

 RewriteEngine On RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{2,4} RewriteCond %{REQUEST_URI} !/$ RewriteRule ^(.*)$ $1.html 

As soluções acima não funcionaram para mim,
Eu encontrei uma solução de trabalho em:
http://www.garron.me/bits/add-html-extension-nginx-apache-htaccess.html
Na seção .htaccess .

RewriteCond% {REQUEST_URI}! ^. .html $ RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule ^ (. ) $ $ 1.html [L, R = 301]

Minha solução para o nginx:

forçando extensão .html

 if ($request_filename !~ ^.+(.html|\/)$) { return 301 $scheme://$host$request_uri.html; }