Ограничьте «статические» псевдонимы поддоменов файлами, отличными от HTML, в противном случае перенаправьте на «www» - PullRequest
5 голосов
/ 07 марта 2011

Я настроил пару «псевдонимов доменов» для веб-сайта, который я использую в качестве поддоменов без файлов cookie, поэтому static.domain.com/style.css обслуживает тот же файл, что и www.domain.com/style.css.

Однако, если кто-то пытается получить доступ к static.domain.com/index.htm, он должен быть перенаправлен на 301 к www.domain.com/index.htm.Правила mod_rewrite, которые у меня есть в корневом веб-каталоге, я думал, что они будут работать, но они, похоже, не будут.

<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>

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Это перенаправит каждый запрос, который не идет для статических файлов:

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]

Читается:

  • ЕСЛИ имя хоста не www.domain.com
  • И запрашиваемый файл не заканчивается разрешенным расширением
  • Затем перенаправить на основной (www) домен

Также для управления версиями (вам нужен не жадный (.+?), потому что .+ съест всю вашу строку и не будет совпадения с шаблоном):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)\.([0-9]+)\.([a-z]+)$ $1.$3 [L]
0 голосов
/ 10 марта 2011

Немного покопавшись в ответе vbence, я наткнулся на более функциональное решение, хотя не уверен, что оно наиболее оптимизированное.

<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>
...