Цикл перенаправления на изображения при использовании перенаправления CDN в .htaccess - PullRequest
2 голосов
/ 02 февраля 2012

Мне трудно понять, что не так.

Как только я добавляю код моей CDN в мой .htaccess для перенаправления статического содержимого в CDN, это приводит к циклу перенаправления этих файлов.

Я заметил, что они продолжают перенаправлять на себя вместо загрузки файла.

Мой .htaccess:

RewriteEngine On

# Force no www
RewriteCond %{HTTP_HOST} ^www [NC]
RewriteRule ^.*$ http://domain.com/$0 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://domain.com/ [R=301,L]

# Rewrite domain.com/p/contact to index.php?p=contact
RewriteRule ^p/([^/]+)/?$ /index.php?p=$1 [L]

Код моего CDN, который нарушает работу сайта:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault A0

    # Set up caching for 1 week(s)
    <FilesMatch "\.(jpe?g|gif|png|bmp|pdf|docx?|xlsx?|ppt|rar|zip|tar|gz|tgz|bz2|flv|avi|mov|wmv|mp3|wav)$">
        ExpiresDefault A604800
        Header append Cache-Control "public"
    </FilesMatch>

    # Set up caching for 1 day(s)
    <FilesMatch "\.(xml|txt)$">
        ExpiresDefault A86400
        Header append Cache-Control "public"
    </FilesMatch>

    # Set up caching for 1 hour(s)
    <FilesMatch "\.(js|css)$">
        ExpiresDefault A3600
        Header append Cache-Control "proxy-revalidate"
    </FilesMatch>

    # Force no caching for dynamic files
    <FilesMatch ".(php|cgi|pl|htm)$">
        ExpiresActive Off
        Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
        Header set Pragma "no-cache"
    </FilesMatch>
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:Via}   !\.s\.worldcdn\.com
    # Flash wont work on cross-domain by default
    RewriteCond $1            !^.swf$ [NC]
    RewriteCond $1            "\.(jpe?g|gif|png|bmp|ico|js|css|pdf|docx?|xlsx?|ppt|rar|zip|tar|gz|tgz|bz2|flv|avi|mov|wmv|mp3|wav|xml|txt)$" [NC]
    RewriteRule ^(.*)           http://cdn.domain.com/$1 [L,R]
</IfModule>

Субдомены, CDN и т. Д. Настроены правильно.

Может быть, это проблема с CDN? Приветствую вас за помощь!

1 Ответ

3 голосов
/ 02 февраля 2012

Из флага L: Apache Документы : flag_l :

Если вы используете RewriteRule в файлах .htaccess или в разделах <Directory>, важно иметь некоторое представление о том, как обрабатываются правила. Упрощенная форма этого заключается в том, что после обработки правил переписанный запрос передается механизму синтаксического анализа URL-адреса, чтобы выполнить с ним все возможное. Возможно, что при обработке переписанного запроса файл или раздел .htaccess могут встретиться снова, и, таким образом, набор правил может быть снова запущен с самого начала. Чаще всего это происходит, если одно из правил вызывает перенаправление - либо внутреннее, либо внешнее - и процесс запроса запускается заново.


Поскольку переписанный запрос передается обратно в механизм синтаксического анализа URL, после перенаправления с последнего RewriteRule здесь,

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:Via}   !\.s\.worldcdn\.com
    # Flash wont work on cross-domain by default
    RewriteCond $1            !^.swf$ [NC]
    RewriteCond $1            "\.(jpe?g|gif|png|bmp|ico|js|css|pdf|docx?|xlsx?|ppt|rar|zip|tar|gz|tgz|bz2|flv|avi|mov|wmv|mp3|wav|xml|txt)$" [NC]
    RewriteRule ^(.*)           http://cdn.domain.com/$1 [L,R]
</IfModule>

либо
отредактируйте эту строку так:

    RewriteRule ^(.*)           http://cdn.domain.com/$1 [L]

или

, если вы хотите изменить URI также в браузере, добавьте первый RewriteCond

    RewriteCond %{HTTP_HOST}  !cdn\.domain\.com
    RewriteCond %{HTTP:Via}   !\.s\.worldcdn\.com
    RewriteCond $1            !^.swf$ [NC]
    RewriteCond $1            "\.(jpe?g|gif|png|bmp|ico|js|css|pdf|docx?|xlsx?|ppt|rar|zip|tar|gz|tgz|bz2|flv|avi|mov|wmv|mp3|wav|xml|txt)$" [NC]
    RewriteRule ^(.*)           http://cdn.domain.com/$1 [L,R]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...