Раздел 4. Руководство по перезаписи URL RU EN Пункт 43. Флаги правил перезаписи В этом документе обсуждаются флаги, доступные для
Введение Цель шаблона RewriteRule [Flag1,Flag2,Flag3] Каждый флаг (за некоторыми исключениями) имеет короткую форму, например
Флаги, которые изменяют метаданные, связанные с запросом (T=, H=, E=), не влияют на каталог и контекст htaccess, когда замена (отличная от '-') выполняется во время одного и того же раунда обработки перезаписи. Здесь представлены все доступные флаги, а также примеры их использования. B (экранировать обратные ссылки)Флаг [B] предписывает В версии 2.4.26 и более поздних можно ограничить экранирование определенными символами в обратных ссылках, перечислив их: RewriteRule "^search/(.*)$" "/search.php?term=$1" При поиске «x & y/z» браузер закодирует его как «x%20%26%20y%2Fz», сделав запрос «search/x%20%26%20y%2Fz». Без флага B это правило перезаписи будет отображаться на «search.php?term=x & y/z», что не является допустимым URL-адресом, и поэтому будет закодировано как , что не предназначено
Если в этом же правиле установлен флаг B, параметры перекодируются перед передачей в выходной URL-адрес, что приводит к правильному сопоставлению с
RewriteRule "^search/(.*)$" "/search.php?term=$1" [B,PT] Обратите внимание, что вам также может понадобиться установить, Это экранирование особенно необходимо в ситуации с прокси, когда серверная часть может сломаться, если будет представлен неэкранированный URL. Альтернативой этому флагу является использование BNP|backrefnoplus (не используйте пробел для +)Флаг [BNP] предписывает Этот флаг доступен в версии 2.4.26 и выше. С|цепьФлаг [C] или [цепочка] указывает, что правило CO|кукиФлаг [CO] или [cookie] позволяет вам установить файл cookie при определенном Полный синтаксис флага, включая все атрибуты, выглядит следующим образом: Если в любом из полей cookie требуется буквальный символ ':', доступен альтернативный синтаксис. Чтобы согласиться на альтернативный синтаксис, перед «Именем» файла cookie должен стоять «;». символ, а разделители полей должны быть указаны как ';'. Вы должны объявить имя, значение и домен для установки файла cookie.
При желании вы также можете установить следующие значения:
Рассмотрим этот пример: RewriteEngine включен RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.com:1440:/] В приведенном примере правило не перезаписывает запрос. Цель перезаписи "-" указывает mod_rewrite передать запрос без изменений. Вместо этого он устанавливает для файла cookie с именем «frontdoor» значение «да». Файл cookie действителен для любого хоста в DPI|путь сбросаФлаг DPI вызывает отбрасывание части PATH_INFO переписанного URI. Этот флаг доступен в версии 2.2.12 и выше. В контексте каждого каталога URI, Текущий URI может быть начальным URI, запрошенным клиентом, результатом предыдущего раунда обработки mod_rewrite или результатом предшествующего правила в текущем раунде обработки mod_rewrite. Напротив, PATH_INFO, который добавляется к URI перед каждым правилом, отражает только значение PATH_INFO до этого раунда обработки mod_rewrite. Как следствие, если большие части URI сопоставляются и копируются в замену в нескольких
Используйте этот флаг при любой подстановке, где PATH_INFO, полученная в результате предыдущего сопоставления этого запроса с файловой системой, не представляет интереса. Этот флаг навсегда забывает PATH_INFO, установленный до начала этого раунда обработки mod_rewrite. PATH_INFO не будет пересчитываться, пока не завершится текущий раунд обработки mod_rewrite. Последующие правила во время этого раунда обработки будут видеть только непосредственный результат подстановки без добавления PATH_INFO. E|окружениеС помощью флага [E] или [env] вы можете установить значение переменной среды. Обратите внимание, что некоторые переменные среды могут быть установлены после запуска правила, что приведет к удалению того, что вы установили. Дополнительные сведения о том, как работают переменные среды, см. в документе «Переменные среды». Полный синтаксис этого флага: [Э=ПЕР.:ВАЛ] [Э=!ВАР] Использование краткой формы вы можете установить переменную среды с именем Форма позволяет сбросить ранее установленную переменную среды с именем
Затем переменные среды можно использовать в различных контекстах, включая программы CGI, другие директивы RewriteRule или директивы CustomLog. В следующем примере переменной среды с именем «image» присваивается значение «1», если запрошенный URI является файлом изображения. Затем эта переменная среды используется для исключения этих запросов из журнала доступа. RewriteRule "\.(png|gif|jpg)$" "-" [E=image:1] CustomLog "logs/access_log" в сочетании env=!image Обратите внимание, что такой же эффект можно получить с помощью КОНЕЦИспользование флага [END] не только завершает текущий раунд обработки перезаписи (например, [L]), но также предотвращает любую последующую обработку перезаписи в контексте для каждого каталога (htaccess). Это не относится к новым запросам, полученным в результате внешних перенаправлений. F|запрещеноИспользование флага [F] заставляет сервер возвращать клиенту код состояния 403 Forbidden. Хотя то же самое поведение может быть выполнено с помощью Следующее правило запрещает RewriteRule "\.exe" "-" [F] В этом примере используется синтаксис "-" для цели перезаписи, что означает, что запрошенный URI не изменяется. Нет причин переписывать на другой URI, если вы собираетесь запретить запрос. При использовании [F] подразумевается [L], то есть ответ возвращается немедленно, и дальнейшие правила не оцениваются. G|ушелФлаг [G] заставляет сервер возвращать статус 410 Gone вместе с ответом. Это указывает на то, что ресурс раньше был доступен, но больше недоступен. Как и в случае с флагом [F], вы обычно будете использовать синтаксис "-" для цели перезаписи при использовании флага [G]: RewriteRule "oldproduct" "-" [G,NC] При использовании [G] подразумевается [L], то есть ответ возвращается немедленно, и дальнейшие правила не оцениваются. H|обработчикПринудительно обрабатывает результирующий запрос указанным обработчиком. Например, это можно использовать для принудительного анализа всех файлов без расширения обработчиком php: Правило перезаписи "!\." "-" [H=приложение/x-httpd-php]
Приведенное выше регулярное выражение - Это также можно использовать для форсирования обработчика на основе некоторых условий. Например, следующий фрагмент, используемый в контексте для каждого сервера, позволяет
отображать RewriteRule "^(/source/.+\.php)s$" "$1" [H=application/x-httpd-php-source] Приведенное выше регулярное выражение -- L|последнийФлаг [L] приводит Если вы используете Поэтому важно, если вы используете Альтернативный флаг [END] может использоваться не только для завершения текущего раунда обработки перезаписи, но и для предотвращения любой последующей обработки перезаписи в контексте для каждого каталога (htaccess). Это не относится к новым запросам, полученным в результате внешних перенаправлений. Приведенный здесь пример переписывает любой запрос на
Переписать базу "/" RewriteCond "%{REQUEST_URI}" "!=/index.php" RewriteRule "^(.*)" "/index.php?req=$1" [L,PT] N|следующийФлаг [N] заставляет набор правил начинать заново с самого начала, используя результат набора правил до сих пор в качестве отправной точки. Используйте с особой осторожностью, так как это может привести к зацикливанию. Флаг [Next] можно использовать, например, если вы хотите повторно заменить определенную строку или букву в запросе. Показанный здесь пример заменяет A на B везде в запросе и будет продолжать делать это до тех пор, пока не останется A, подлежащих замене. Правило перезаписи "(.*)A(.*)" "$1B$2" [N] Вы можете думать об этом как о В версии 2.4.8 и более поздних версиях этот модуль возвращает ошибку после 32 000 итераций для защиты от непреднамеренного зацикливания. Альтернативное максимальное количество итераций можно указать, добавив к флагу N. # Будьте готовы заменить 1 символ в каждом проходе цикла RewriteRule "(.+)[><;]$" "$1" [N=64000] # ... или отказаться, если после 10 циклов RewriteRule "(.+)[><;]$" "$1" [N=10] NC|без делаИспользование флага [NC] приводит к В приведенном ниже примере любой запрос файла изображения будет проксироваться на ваш выделенный сервер изображений. Совпадение не чувствительно к регистру, поэтому
допустимы, например, RewriteRule "(.*\.(jpg|gif|png))$" "http://images.example.com$1" [P,NC] NE|без побегаПо умолчанию специальные символы, такие как RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R]
Приведенный выше пример будет перенаправлен NS|nosubreqИспользование флага [NS] запрещает использование правила в подзапросах. Например, страница, включенная с помощью SSI (включение на стороне сервера), является подзапросом, и вы можете избежать перезаписи этих подзапросов. Кроме того, когда Чтобы решить, использовать это правило или нет: если вы добавляете к URL-адресам префикс CGI-скриптов, чтобы заставить их обрабатываться CGI-скриптом, вполне вероятно, что вы столкнетесь с проблемами (или значительными накладными расходами) при подзапросах. В этих случаях используйте этот флаг. Изображения, файлы javascript или файлы css, загружаемые как часть HTML-страницы, не являются подзапросами — браузер запрашивает их как отдельные HTTP-запросы. P|проксиИспользование флага [P] приводит к тому, что запрос обрабатывается
RewriteRule "/(.*)\.(jpg|gif|png)$" "http://images.example.com/$1.$2" [P] Использование флага [P] подразумевает [L] — то есть запрос немедленно проталкивается через прокси, и любые последующие правила не будут учитываться.
Вы должны убедиться, что строка подстановки является допустимым URI (обычно начинающимся с Предупреждение безопасностиБудьте осторожны при создании целевого URL-адреса правила, учитывая влияние на безопасность, если разрешить клиенту влиять на набор URL-адресов, для которых ваш сервер будет выступать в качестве прокси. Убедитесь, что часть схемы и имени хоста в URL-адресе фиксирована или не допускает чрезмерного влияния клиента. Предупреждение о производительностиИспользование этого флага запускает использование Это связано с тем, что этот флаг запускает использование рабочего процесса по умолчанию, который не обрабатывает пул/повторное использование соединений. Избегайте использования этого флага и отдавайте предпочтение этим директивам, когда это возможно. Примечание: PT|проходной
Целью (или строкой подстановки) в RewriteRule по умолчанию считается путь к файлу. Использование флага [PT] приводит к тому, что он рассматривается как URI. Другими словами, использование флага [PT] вызывает передачу результата
Если, например, у вас есть
Псевдоним "/icons" "/usr/local/apache/icons" RewriteRule "/pics/(.+)\.jpg$" "/icons/$1.gif" [PT] Отсутствие флага [PT] в этом случае приведет к игнорированию псевдонима, что приведет к возврату ошибки «Файл не найден». Флаг Обратите внимание, что QSA|qsдобавлять
Когда замещающий URI содержит строку запроса, по умолчанию Рассмотрим следующее правило: RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA] С флагом [QSA] запрос QSD|qsотменить
Если запрошенный URI содержит строку запроса, а целевой URI — нет, по умолчанию Этот флаг доступен в версии 2.4.0 и выше. Совместное использование [QSD] и [QSA] приведет к тому, что [QSD] будет иметь приоритет.
Если у целевого URI есть строка запроса, будет наблюдаться поведение по умолчанию, то есть исходная строка запроса будет отброшена и заменена строкой запроса в целевом QSL|qsпоследняя
По умолчанию первый (самый левый) вопросительный знак в подстановке отделяет путь от строки запроса. Использование флага [QSL] указывает
Это полезно при сопоставлении с файлами, в именах которых есть буквальные вопросительные знаки. Если при подстановке не используется строка запроса, к ней может быть добавлен вопросительный знак в сочетании с этим флагом. Этот флаг доступен в версии 2.4.19 и выше. R|перенаправить
Использование флага [R] вызывает перенаправление HTTP в браузер. Если указан полный URL-адрес (то есть включая
Любой действительный код состояния ответа HTTP может быть указан с использованием синтаксиса [R=305], при этом по умолчанию используется код состояния 302, если он не указан. Указанный код состояния не обязательно должен быть кодом состояния перенаправления (3xx). Однако если код состояния выходит за пределы диапазона перенаправления (300-399), то строка замены полностью отбрасывается, а перезапись останавливается, как если бы они В дополнение к кодам состояния ответа вы также можете указать статус перенаправления, используя их символические имена:
Вы почти всегда будете использовать [R] в сочетании с [L] (то есть использовать [R,L]), потому что сам по себе флаг [R] предшествует URI, но затем передает его
S|пропуститьФлаг [S] используется для пропуска правил, которые вы не хотите запускать. Синтаксис флага пропуска следующий: [S= N ], где N означает количество пропускаемых правил (при наличии # Является ли запрос несуществующим файлом? RewriteCond "%{REQUEST_FILENAME}" "!-f" RewriteCond "%{REQUEST_FILENAME}" "!-d" # Если это так, пропустите эти два RewriteRules Правило перезаписи ".?" "-" [С=2] RewriteRule "(.*\.gif)" "images.php?$1" RewriteRule "(.*\.html)" "docs.php?$1" Этот метод полезен, потому что a # Существует ли файл? RewriteCond "%{REQUEST_FILENAME}" "!-f" RewriteCond "%{REQUEST_FILENAME}" "!-d" # Создайте конструкцию if-then-else, пропустив 3 строки, если мы хотели перейти к строфе else. Правило перезаписи ".?" "-" [С=3] # ЕСЛИ файл существует, то: RewriteRule "(.*\.gif)" "images.php?$1" RewriteRule "(.*\.html)" "docs.php?$1" # Пропустить строфу else. Правило перезаписи ".?" "-" [С=1] # ЕЩЕ... RewriteRule "(.*)" "404.php?file=$1" # КОНЕЦ Вероятно, проще выполнить такую настройку, используя вместо этого директивы Т|типУстанавливает тип MIME, с которым будет отправлен результирующий ответ. Это имеет тот же эффект, что и Например, вы можете использовать следующую технику для предоставления исходного кода Perl в виде обычного текста, если он запрошен определенным образом: # Подавать файлы .pl как обычный текст Правило перезаписи "\.pl$" "-" [T=текст/обычный] Или, возможно, если у вас есть камера, которая создает изображения в формате jpeg без расширений файлов, вы можете заставить эти изображения обслуживаться с правильным типом MIME на основании их имен файлов: # Файлы с 'IMG' в названии являются изображениями в формате jpg. RewriteRule "IMG" "-" [T=image/jpg] Обратите внимание, что это тривиальный пример, и его лучше использовать
Если используется в контексте каталога, используйте только |
![]() |