К основному контенту

.htaccess Ниндзя - Часть 2

Продолжая тему редиректа…

Вложеный редирект

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} !-d

RewriteCond $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 в своем имени, и предотвращаем.

Комментарии

Популярные сообщения из этого блога

Русская кодировка ASCII, ANSI и UTF-8, windows-1251 (CR, LF, CR LF)

Что нужно знать: Encoding – это кодировка для вывода данных (UTF-8, windows-1251) Line Endings – формат строк (CR, LF, CR LF) Byte Order Marker (BOM) – системная область в начале файла. LF – используется в UNIX вместе с кодировками UTF-8 или windows-1251 CR – используется в MAC системах. на сервере лучше использовать кодировку ANSI это и есть кириллица (Windows), символ занимает 1 байт (оптимизированный ASCII) UTF-8 может содержать заголовок BOM который содержит системную информацию, символ занимает 2 байта wysiwyg редакторы добавляют метатег в html страницы с кодировкой кирилицы. это не очень хорошо, если сервер настроен на UTF-8, в этой кодировке корректно работают некоторые библиотеки приложения и прочие

Как узнать время включения/выключения компьютера.

Способов масса, одни из них: в журнале событий windows  выбрать eventlog, теперь в таблице легко найти события с кодами: 6005 - событие остановки eventlog - компьютер выключился 6006 - событие запуска eventlog - компьютер включился обычно эта служба запускается и остонавли во время включения/выключения компьютера, и пишет в журнале событий системы код события и время.

Извлечение, редактирование и публикация файлов в SharePoint

Теги: Sharepoint в sharepoint designer на ленте за извлечение / редактирование или отмену извлечений отвечают кнопки  в браузере это выглядит по другому   файл извлечен и пока редактируется пользователем   страница с индивидуальным дизайном возврат страницы с индивидуальным дизайном к определению узла (к первоначальному виду не изменяя веб-части) Возврат извлеченной страницы с отменой всех внесенных изменений Изначально извлечение было создано для исключения конфликтов при редактировании файлов. Например если один пользователь открыл документ и редактирует, то второй не сможет открыть пока первый не вернет документ на место. Простыми словами извлечение значит, что пользователь забирает документ для редактирования. И возвращает после окончания редактирования. Само редактирование может выполняться и без подключения к сети, документ хранится в черновиках моих документов. В официальной документации сказано: Извлечение файлов позволяет избежать ситуации, когда несколь