2011-03-07 17 views
5

He configurado un par de "alias de dominio" para un sitio web que estoy usando como subdominios sin cookies , por lo que static.domain.com/style.css sirve el mismo archivo que www.domain.com/style.css.Restringir alias de subdominio "estáticos" a archivos que no sean HTML, de lo contrario redirigir a "www"

Sin embargo, si alguien intenta acceder a static.domain.com/index.htm deben ser 301 redirigidos a www.domain.com/index.htm. Las reglas mod_rewrite que tengo en el directorio web raíz pensé que funcionarían pero no parecen ser así.

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # "/res/all.20110101.css" => "/res/all.css" 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|jpeg|gif)$ $1.$3 [L] 

    # Except for "static" sub-domains, force "www" when accessed without 
    RewriteCond %{HTTP_HOST} . 
    RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC] 
    RewriteCond %{HTTP_HOST} !^s-img\.domain\.com [NC] 
    RewriteCond %{HTTP_HOST} !^static\.domain\.com [NC] 
    RewriteRule (.*) http://www.domain.com/$1 [R=301,L] 

    # If file requested is HTML, force "www" 
    <FilesMatch "\.(htm|html|php)$"> 
     RewriteCond %{HTTP_HOST} . 
     RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC] 
     RewriteRule (.*) http://www.domain.com/$1 [R=301,L] 
    </FilesMatch> 

</IfModule> 
+1

Solo para aclarar sus reglas: los archivos como '/ res/all.20110101.css' * no * existen y el número es solo para el almacenamiento en caché, ¿correcto? – nickgrim

+0

@nickgrim: Correcto, esa regla es para nombres de archivos flexibles, por lo que el almacenamiento en memoria caché es más confiable que el uso de cadenas de consulta. http://j.mp/qs-cb – Marcel

Respuesta

0

Después de jugar un poco con la vbence respuesta, me encontré con una solución más funcional, aunque no estoy seguro de si es la más optimizada.

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # Requests for "/res/all.20110101.css" serve up "/res/all.css", etc. 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.+?)\.([0-9]+)\.([a-z]+)$ $1.$3 [L] 

    # If the hostname isn't www.domain.com AND requested file's extension 
    # isn't in the filter list, redirect to the www.domain.com version. 
    RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
    RewriteCond %{REQUEST_FILENAME} !\.(js|css|png|jpe?g|gif)$ [NC] 
    RewriteRule (.*) http://www.domain.com/$1 [R=301,L] 

</IfModule> 
+0

Sugiero agregar un '$' después de '!^Www \ .dominio \ .com'. Para la situación poco probable cuando se crea un subdominio como 'www.dominio.com.someotominio.com'. Es más seguro ser lo más específico posible. – vbence

+0

Gracias por su ayuda compañero. – Marcel

2

Esto redirigir todas las solicitudes que no va a archivos estáticos:

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteCond %{REQUEST_FILENAME} !\.(js|css|png|jpg|jpeg|gif)$ [NC] 
RewriteRule (.*) http://www.domain.com/$1 [R=301,L] 

Se lee:

  • Si el nombre no es www.domain.com
  • y pidió el archivo no finaliza con una extensión permitida
  • Luego, redirija al dominio maestro (www)

También para su control de versiones (se necesita el no expansivo (.+?) porque .+ comería toda la cadena y no habría ningún partido para el patrón):

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+?)\.([0-9]+)\.([a-z]+)$ $1.$3 [L] 
+0

Se agregó una regla separada para el control de versiones. – vbence

+0

Gracias vbence. Tuve problemas para habilitar un segundo subdominio estático usando el primer fragmento de código. Intenté duplicar la primera línea y cambiar el subdominio en consecuencia, pero no funcionó. De todos modos, después de meterme con todo, con un poco de ayuda de ti, terminé con un conjunto de reglas mod_rewrite más compacto y funcional. Contestaré mi propia pregunta con ella, ya que resolvió mejor mi pregunta. – Marcel

+0

No dijiste que necesitabas un segundo dominio. Lo vi como muestra de tu código, pero lo descarté porque no lo mencionaste en tu pregunta. De todos modos, recomendaría no usar reglas demasiado compactas. Cambiarlos más tarde suele ser problemático. Más bien intente separar sus reglas a unidades atómicas funcionales. – vbence

Cuestiones relacionadas