Продолжая тему редиректа…
Вложеный редирект
1: RewriteEngine on
2: RewriteCond $1 !^(index\.php|images|robots\.txt)
3: RewriteRule ^(.*)$ /index.php/$1 [L]
пояснения:
руль в третьей строке выбирает всю строку ревнивой выборкой, оператором память вставляет вместо $1,
[L] – это флаг который не относится к выражением, говорит о том, что при положительных результатах следующие правила не обрабатываются. Эксит вон.
почитать подробней записал: особенности регулярных выражений (не забыть).
Редирект 404 с передачей строки запроса
файл 1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-dRewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /ru/index.php/$1 [L]
примечание: можно и без [L]
файл 2
RewriteEngine On
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /ru/index.php/$1 [L]
Другие конфигурации
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
#главная
RewriteRule ^$ router.php?cont=index [L]
# отрасль
RewriteRule ^([a-z]+)/$ router.php?cont=otr&otr=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ router.php?cont=404&tmp=$1 [L]
Как только URL соответствует какому либо правилу, router.php передаются необходимые параметры и проверка остальных правил не производится (за это отвечает флаг [L]).
Но на практике проверка производится до конца в любом случае.
строчка проверяет симлинки:
RewriteCond %{REQUEST_FILENAME} !-l
вот еще сказано в тему, если придется пользоваться GET запросами изменение URL адресов или приведение к ЧПУ виду.
Сжатие данных
AddEncoding gzip .gz
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz [QSA,L]
По строчкам:
Включается gzip
Проверяется клиент умеет ли читать GZIP
Исключаем сафари
проверяем существования файла с окончанием .gz
и перенаправляем с добавлением к запросу .gz окончания
Статически на сервере располагают файлы примерно так:
index.html – не сжатый
index.html.gz – сжатый
prototype.js – не сжатый
prototype.js.gz – сжатый
не сжатый вариант для клиентов которые не умеют разжимать GZIP
это был статический метод.
динамический метод:
<IfModule mod_rewrite.c>
RewriteEngine On
AddEncoding gzip .gz
RewriteCond %{HTTP:Accept-encoding} !gzip [OR]
RewriteCond %{HTTP_USER_AGENT} Safari [OR]
RewriteCond %{HTTP_USER_AGENT} Konqueror
RewriteRule ^(.*)\.gz(\?.+)?$ $1 [QSA,L]
</IfModule>
<IfModule mod_headers.c>
Header append Vary User-Agent
<FilesMatch .*\.js.gz$>
ForceType text/javascript
Header set Content-Encoding: gzip
Header set Cache-control: private
</FilesMatch>
<FilesMatch .*\.css.gz$>
ForceType text/css
Header set Content-Encoding: gzip
Header set Cache-control: private
</FilesMatch>
</IfModule>
будем переопределять физический адрес ресурса только для «старых» браузеров, а для всех остальных отдавать рядовой файл.В итоге, логика «переворачивается», и вместо набора «И»-условий мы получаем «ИЛИ»-условия. Первые пять строк уже достаточно подробно обсуждены вверху.RewriteRule ^(.*)\.gz(\?.+)?$ $1 [QSA,L] – учет уникальной GET строки, для перезагрузки кэша у клиента если ресурс поменялся например fddds.css.gz?v34342здесь статья.и заключительное решение, ввиду большинства браузеровизменилась. Поэтому предлагаю следующий набор правил в качестве наиболее актуального:<IfModule mod_rewrite.c>
RewriteEngine On
#перенаправляем Konqueror и «старые браузеры»
RewriteCond %{HTTP:Accept-encoding} !gzip [OR]
RewriteCond %{HTTP_USER_AGENT} Konqueror
RewriteRule ^(.*)\.(css|js)$ $1.nogzip.$2 [QSA,L]
</IfModule>
<IfModule mod_headers.c>
Header append Vary User-Agent
#выставляем для всех css/js файлов Content-Encoding
<FilesMatch .*\.(js|css)$>
Header set Content-Encoding: gzip
Header set Cache-control: private
</FilesMatch>
#сбрасываем Content-Encoding в том случае, если отдаем не архив
<FilesMatch .*\.nogzip\.(js|css)$>
Header unset Content-Encoding
</FilesMatch>
</IfModule>
предотвращение случая зацикливания, когда нет файла .gzRewriteCond %{REQUEST_FILENAME} !.nogzip
RewriteCond %{HTTP:Accept-encoding} !gzip
RewriteRule ^(.*)\.(css|js)?$ $1.nogzip.$2 [QSA,L]RewriteCond %{REQUEST_FILENAME} !.nogzip
RewriteCond %{HTTP_USER_AGENT} Konqueror
RewriteRule ^(.*)\.(css|js)?$ $1.nogzip.$2 [QSA,L]
Таким образом мы запрещаем редиректы для файлов, имеющих .nogzip в своем имени, и предотвращаем.
Комментарии
Отправить комментарий