texto - el sitio 5 veces más rápido a través de mod_rewrite, pero las imágenes CSS están rotas
mostrar texto hover css (2)
Estoy usando .htaccess para acelerar un sitio con los siguientes redireccionamientos:
request for http://example.com/images/name.jpg routed to http://i.example.com/name.jpg
request for http://example.com/css/name.css routed to http://c.example.com/name.css
Al escuchar el podcast Stack Overflow, aprendí que esto podría hacer que un sitio sea más rápido, ya que el navegador puede descargar más archivos simultáneamente (aparentemente dos flujos por dominio, aunque esto no está confirmado).
De hecho, la diferencia es dramática; ¡la página carga aproximadamente cinco veces más rápido !
No he tocado las carpetas e imágenes originales: solo estoy usando mod_rewrite para cambiar las direcciones de example.com/images/ a i.example.com/ :
rewritecond %{HTTP_HOST} !^i/.example/.com [NC] rewriterule ^images/([^/]+)$ http://i.example.com/$1 [L] rewritecond %{HTTP_HOST} !^c/.example/.com [NC] rewriterule ^css/([^/]+)$ http://c.example.com/$1 [L]
El problema que tengo es que esta técnica funciona perfectamente para etiquetas de imagen incluidas en html, pero no funciona para imágenes incluidas a través de hojas de estilo:
img src = / images / logo.jpg funciona a la perfección
fondo: url (/images/logo.jpg); No funciona
El registro de errores del servidor contiene la siguiente entrada:
El archivo no existe: / var / www / html / css / images, referer: http://example.com/page.html
Esto parece implicar que la regla de reescritura se está aplicando incorrectamente.
Las hojas de estilo funcionan si uso:
fondo: url ( http://i.example.com/logo.jpg );
Sin embargo, para evitar reescribir todas las hojas de estilo, me gustaría saber: ¿por qué la reescritura de URL no se aplica a las hojas de estilo de la misma manera que a las etiquetas html img ?
[update1] Este problema existe en Safari 4 Beta, Firefox 3.0.3 y Chrome, pero la página funciona perfectamente en IE6 .
[actualización2] Agregar [L, R = 301] y [L, R = 302] no ayudó.
[update3] Intenté lo siguiente a partir de la sugerencia de Gumbo a continuación:
Redirigir externamente si la ruta no coincide con el nombre de host:
rewritecond %{HTTP_HOST} !^i/.domain/.com$
rewriterule ^images/([^/]+)$ http://i.domain.com/$1 [L,R=301]
rewritecond %{HTTP_HOST} !^c/.domain/.com$
rewriterule ^css/([^/]+)$ http://c.domain.com/$1 [L,R=301]
Redirigir internamente; si hay un nombre innecesario de carpeta elimínelo (vea el error del servidor más arriba):
rewritecond %{HTTP_HOST} ^i/.domain/.com$
rewriterule ^images/([^/]+)$ $1 [L]
rewritecond %{HTTP_HOST} ^c/.domain/.com$
rewriterule ^css/([^/]+)$ $1 [L]
Todavía no funcionó. Curiosamente, el error del servidor es:
El archivo no existe: / var / www / html / css / var, referer: http://domain.com/page.html
Encontré una manera de resolver este problema si todos los nombres de host usan el mismo host virtual:
# redirect externally if path doesn’t match host name
RewriteCond %{HTTP_HOST} !^i/.example/.com$
RewriteRule ^images/([^/]+)$ http://i.example.com/$1 [L,R=301]
RewriteCond %{HTTP_HOST} !^c/.example/.com$
RewriteRule ^css/([^/]+)$ http://c.example.com/$1 [L,R=301]
# redirect internally to the file
RewriteCond %{HTTP_HOST} ^i/.example/.com$
RewriteRule !^images/ images%{REQUEST_URI} [L]
RewriteCond %{HTTP_HOST} ^c/.example/.com$
RewriteRule !^css/ css%{REQUEST_URI} [L]
Esto hará lo siguiente:
http://example.com/css/foo externally to http://c.example.com/foo
http://c.example.com/foo internally to /css/foo
http://example.com/images/bar externally to http://i.example.com/bar
http://i.example.com/bar internally to /images/bar
Además de corregir rutas y nombres de host que no coinciden:
http://i.example.com/css/foo externally to http://c.example.com/foo
http://c.example.com/images/bar externally to http://i.example.com/bar
Se produce un desajuste cuando la hoja de estilo solicitada http://example.com/css/foo
se redirige a http://c.example.com/foo
y se resuelve una referencia de URI de imagen como /images/bar
dentro de la hoja de estilo desde esta nueva URI base y, por lo tanto, conduce a http://c.example.com/images/bar
lugar de la http://example.com/images/bar
inicial.
Pude resolver esto al no intentar incorporar directorios en los subdominios :
request for domain.com/images/ routed to i.domain.com/images/ request for domain.com/css/ routed to c.domain.com/css/
Funciona perfectamente y sigue siendo extremadamente rápido .
Parece que hay un error en los navegadores modernos en los que una solicitud CSS que se redirige aplicará solo el nuevo dominio , dejando los directorios originales como parte de la solicitud:
Si una imagen css en url (domain.com/images/name.jpg) se redirige a i.domain.com/name.jpg , el navegador solicitará i.domain.com/images/name.jpg por error.