2011-04-21 8 views
10

Necesito una regla que agregará una extensión .html siempre que no haya una barra inclinada.Reescribir la regla para agregar la extensión .html

Un nuevo cliente ha cambiado recientemente los scripts de comercio electrónico y la nueva versión maneja el SEO de manera diferente y ha cambiado todos sus 16,000 enlaces de productos. Esto no fue capturado antes del sitio de volver a ser indexados por lo que necesitamos para redirigir la antigua a la nueva ..

Todos los productos que se utilizan para tener enlaces de esta manera domain.com/category/productname pero ahora son dominio .com/categoría/productname.html

Categoría enlaces no cambiaron y todos son así domain.com/category/ (con barra diagonal)

Respuesta

4
 
RewriteEngine On 
RewriteCond %{REQUEST_URI} ! \.html$ 
RewriteCond %{REQUEST_URI} ! /$ 
RewriteRule ^(.*)$ $1.html 

es posible que desee lanzar una [R] allí, o algo así también. Ver documentos: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule (busque "redirigir | R").

+0

Por lo tanto, he probado esto (incluyendo la adición de una [R = 301, L] en el extremo) y me da una 500 error para cualquier solicitud Probé una RewriteRule simple en el servidor y funcionó, así que supongo que hay un error en esto y no en la configuración general de .htaccess/mod_rewrite en ese servidor. – greggles

14

La respuesta de @ david-wolever redirige todo lo que no termina en .html (o la raíz) a la misma URL con una extensión .html agregada, lo que significa que agrega una extensión .html a cosas como archivos CSS y JavaScripts , p.ej redirigirá /style.css a /style.css.html, que probablemente no sea lo que quieres. ¡También tiene los espacios después! personaje que probablemente causada @greggles 500s

Esto redirige URLs que no terminen en un punto seguido de 3 o 4 caracteres alfanuméricos:

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

o para el control de grano más fino, la lista blanca las extensiones que no desea .html adjuntado a, por ejemplo

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

¿Puedo escapar solo por una URL? porque si uso esto en el sitio de wordpress, no podré ir a la página de administración. Porque cuando escribo "domain/wp-admin" me redireccionará a domain/wp-admin.html y devolveré 404. Lo mismo ocurre con todas las respuestas en este hilo. –

+0

Desafortunadamente esto no funciona en las URL con fragmentos hash, que es la aplicabilidad de límites de este –

6

Esta opción es similar a @ remco, pero no requiere el uso de [R] (un redireccionamiento "externo" enviado de vuelta al navegador). También he añadido un \ faltante en la primera condición:

Options FollowSymLinks 

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

La respuesta de @ paul.grov.es parecía funcionar bien para mí, pero luego me di cuenta de que mi javascript ya no funcionaba.

La solución es obvia y mencionada por él: se estaba agregando un '.html' a la url, dado que la extensión javascript solo tiene 2 caracteres.

Por lo tanto, mi solución resultó ser:

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

Esta es realmente la respuesta correcta, ya que todas las otras respuestas no verifican la existencia de la url que termina con una extensión diferente de .html, esto uno lo comprobará y también verificará si se trata de un directorio. ¡Solo necesita cambiar de '' 'RewriteCond% {REQUEST_URI}!/$' '' A '' RewriteCond% {REQUEST_FILENAME}! -d'''. –

3

Este es el hilo viejo, pero es todavía vale la pena publicar un/respuesta probado de trabajo para este problema:

RewriteEngine On 

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

ha parado RewriteCond %{REQUEST_FILENAME} !-f condición, ya el patrón regex no coincide con ningún URI con punto en él.

+0

Mi sitio actualmente permite que example.com/test y example.com/test.html funcionen. Quiero reenviar todo no html para forzar .html. ¿Puedo usar su anterior y cambiar 302 a 301? – user1040259

+0

sí, debería funcionar, creo. – anubhava

+0

gracias! Usted ayudó en el pasado, necesito revertir la configuración. Gracias. http://stackoverflow.com/questions/39092679/htaccess-301-redirect-to-html – user1040259

0

Mi solución para nginx:

forzando la extensión .html

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