Как заставить .htaccess прикрепить REQUEST_URI к странице 404



Есть ли способ отправить запрос URI на страницу 404 в качестве переменной URL? Например, если я пересылаю свои 404 с директивой ErrorDocument , есть ли способ сделать что-то подобное? Это код, который я пробовал, но он, очевидно, не сработал.

ErrorDocument 404 /pages/errors/index.php?e=404&url=%{REQUEST_URI}

Я также попробовал mod_rewrite, но это тоже не сработало. Вот что я попробовал с mod_rewrite:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404&url=%{REQUEST_URI} [L,R=404]

В основном все, что я пытаюсь сделать, это сделать так, чтобы, когда пользователь вводит что-то вроде http://mysite.com/asdf , он перенаправляется на http://mysite.com/pages/errors/index.php?e=404&url=/asdf , предполагая, что каталог

/asdf не существует на сервере.

Есть ли простой способ достичь этого?

php .htaccess mod-rewrite errordocument
Поделиться Источник SISYN     26 января 2013 в 01:52

6 ответов


  • ErrorDocument 404 не работает с маршрутизацией

    Я попытался использовать этот код на .htacces , чтобы иметь свой собственный пользовательский 404 на моей странице. ErrorDocument 404 http://mysite.com/404.shtml когда я посещаю страницу, которая не существует на сайте. он должен показывать что-то вроде этого но это то, что он показывает вот мой…

  • Rewriterule on .htaccess приводит к 404

    Я разрабатываю приложение, которое размещено на сервере apache с PHP 5. На домене уже работает сайт: www.domain.com. Мое приложение находится в папке с именем ‘hotsite’, и к нему можно получить доступ с помощью url www.domain.com/hotsite/. Корневая папка содержит .htaccess, содержащий: /….



3

Я не думаю, что вам нужно передавать какую-либо дополнительную информацию скрипту обработчика ошибок, если это то, о чем вы спрашиваете. Apache предоставляет достаточно информации:

Перенаправление на другой URL может быть полезным, но только в том случае, если можно передать некоторую информацию, которая затем может быть использована для более четкого объяснения или регистрации состояния ошибки.

Для этого при отправке перенаправления ошибки будут установлены дополнительные переменные среды, которые будут сгенерированы из заголовков, предоставленных исходному запросу, путем добавления ‘REDIRECT_’ к имени исходного заголовка. Это предоставляет документ об ошибке в контексте исходного запроса.

Например, в дополнение к более обычным переменным среды вы можете получить следующее.

REDIRECT_HTTP_ACCEPT= / , image/gif, image/jpeg, изображение/png

REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8

REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin

REDIRECT_QUERY_STRING=

REDIRECT_REMOTE_ADDR=121.345.78.123

REDIRECT_REMOTE_HOST=client.example.com

REDIRECT_SERVER_NAME=www.example.edu

REDIRECT_SERVER_PORT=80

REDIRECT_SERVER_SOFTWARE=Apache/2.2.15

REDIRECT_URL=/cgi-bin/buggy.pl

Переменные среды REDIRECT_ создаются из переменных среды, существовавших до перенаправления. Они переименовываются с префиксом REDIRECT_, т. е. HTTP_USER_AGENT становится REDIRECT_HTTP_USER_AGENT.

REDIRECT_URL, REDIRECT_STATUS и REDIRECT_QUERY_STRING гарантированно будут установлены, а другие заголовки будут установлены только в том случае, если они существовали до состояния ошибки.

Ни один из них не будет установлен, если цель ErrorDocument является внешним перенаправлением (все, что начинается с имени схемы, например http:, даже если оно относится к тому же хосту, что и сервер).

Проверьте эту ссылку

Поделиться Felipe Alameda A     26 января 2013 в 02:17



2

Я думаю, вам нужно удалить R=404 . Это сработало для меня;

Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* index.php?e=404&url=%{REQUEST_URI} [L]

Тесты: foo/index.php : print_r($_GET)

localhost/foo -> Array ( )

localhost/foo/asdf -> Array ( [e] => 404 [url] => /foo/asdf )

Поделиться K-Gun     26 января 2013 в 02:38



1

Ваша первая попытка поместить %{REQUEST_URI} в директиву ErrorDocument теперь должна работать в последней версии Apache. От https:/ / httpd.apache.org/docs / 2.4 / mod/core.html#errordocument :

Начиная с 2.4.13, синтаксис выражения может использоваться внутри директивы для создания динамических строк и URLs.

Поделиться pdr     30 июня 2020 в 13:57


  • .откройте файл. htaccess чистый URLs со слизнями 404 не найдено

    Я прошу прощения за то, что снова задаю этот вопрос, но я не могу заставить свой URLs работать, не получив ошибку 404 страницы. public_html .htaccess webroot+ index.php article.php Я использую htaccess, чтобы сделать папку webroot основным корнем документа ( у меня нет доступа к виртуальным…

  • Нет 404 после URL переписать в htaccess

    После переписывания всех моих правил url все, что передается, рассматривается как правило переписывания, и это приводит к тому, что никогда не будет 404 страниц! Как я могу обслуживать 404 страницы для страниц, которые не найдены, то есть example.com/books-это url переписано, что прекрасно. Однако…



0

У меня есть еще одна идея, поскольку вы используете php, почему бы просто не получить доступ к

$_SERVER['HTTP_REFERER'] . Это показывает вам предыдущий запрос страницы, так что, вероятно, это будет именно то, что вы ищете. Оттуда вы можете делать с этим значением все, что хотите. Это работает?

Поделиться Landon     26 января 2013 в 01:59



0

Вы уже проверяете файл/папку, существующую до перезаписи, с помощью rewritecond, вам не нужно использовать запрос uri в правиле перезаписи и обрабатывать его с помощью $_SERVER['REQUEST_URI']

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404 [L,R=404]

Поделиться Tufan Barış Yıldırım     26 января 2013 в 02:10



0

Наконец-то это сработало, хотя и немного нетрадиционно. Я использую ColdFusion вместо PHP, и другие ответы здесь, к сожалению, не сработали для меня. Но я думаю, что это будет работать для всех, независимо от их серверной платформы, потому что она основана на javascript:

В .htaccess:

ErrorDocument 404 /mark404.cfm

В /mark404.cfm

<script>
   window.location = '/handle404.cfm';
</script>

В /handle404.cfm

<script>
    var r = document.referrer;
    //this is what you want, the url that the user tried to hit
</script>

Причина, по которой это работает, заключается в том, что браузер все еще «thinks» находится на запрошенном doesntexist.html, когда он попадает в mark404. Поэтому, когда вы перенаправляете на handle404, doesntexist.html находится в истории браузера, и javascript может забрать его.

Поделиться

Kiran Kota     13 ноября 2015 в 04:15


Похожие вопросы:


Передача параметра в URL приводит к 404 странице в codeigniter?

Я пробовал код для передачи параметра в URL, но система рассматривает его как параметр и приводит к странице ошибки 404 Ниже приведен код, который я использую для того же самого <a…


htaccess 404 перестал работать

У меня была страница 404 ошибка редирект работает просто отлично через реврайт. Однако после добавления нового кода в htaccess он перестал работать. Что вызывает конфликт и как я могу его исправить?…


{REQUEST_URI} в .htaccess не соответствует должным образом для SSL перезаписи

Эй, я пытаюсь использовать .htaccess, чтобы заставить SSL появиться на странице моего сайта. В моем .htaccess я делаю это: RewriteCond %{SERVER_PORT} 80 RewriteCond %{REQUEST_URI} auth/login…


ErrorDocument 404 не работает с маршрутизацией

Я попытался использовать этот код на .htacces , чтобы иметь свой собственный пользовательский 404 на моей странице. ErrorDocument 404 http://mysite.com/404.shtml когда я посещаю страницу, которая не…


Rewriterule on .htaccess приводит к 404

Я разрабатываю приложение, которое размещено на сервере apache с PHP 5. На домене уже работает сайт: www.domain.com. Мое приложение находится в папке с именем ‘hotsite’, и к нему можно получить…


.откройте файл. htaccess чистый URLs со слизнями 404 не найдено

Я прошу прощения за то, что снова задаю этот вопрос, но я не могу заставить свой URLs работать, не получив ошибку 404 страницы. public_html .htaccess webroot+ index.php article.php Я использую…


Нет 404 после URL переписать в htaccess

После переписывания всех моих правил url все, что передается, рассматривается как правило переписывания, и это приводит к тому, что никогда не будет 404 страниц! Как я могу обслуживать 404 страницы…


Исключить каталог из htaccess

Я хочу создать ограниченную область в подкаталоге, но есть некоторый конфликт с htaccess, автоматически сгенерированным из WorPdress на домашней странице, и поэтому я получил перенаправление на…


htaccess изменить часть имени REQUEST_URI, если IMAGE не найден 404/403

привет, мне нужна помощь с htaccess и изменением части REQUEST_URI у меня есть изображения на многих папках, таких как эта url: https://pic.domain.com/images/111/34%20(Big).jpg только если это…


Как передать REQUEST_URI из htaccess в PHP

Я настраиваю редирект URL, где передаю REQUEST_URI из файла .htaccess в файл PHP. Вот моя структура файлов: index.php .htaccess folder/index.php Если URL-это http://example.com/?something Я хочу…

Тысячи ошибок robots.txt 404 от ботов, пытающихся сканировать старый мультисайт

При выполнении вида перенаправления, который вы делаете, есть только один код ответа HTTP, который применим, а именно 301 Moved Permanently, RFC 2616, стандарт, который определяет протокол HTTP, определяет код ответа 301 таким образом (мой акцент):

Запрошенному ресурсу был назначен новый постоянный URI, и любые будущие ссылки на этот ресурс ДОЛЖНЫ использовать один из возвращенных URI. Клиенты с возможностями редактирования ссылок должны автоматически связывать ссылки на Request-URI с одной или несколькими новыми ссылками, возвращаемыми сервером, где это возможно. Этот ответ кешируется, если не указано иное.

Новый постоянный URI ДОЛЖЕН быть задан в поле Location в ответе. Если метод запроса не является HEAD, объект ответа ДОЛЖЕН содержать краткую гипертекстовую заметку с гиперссылкой на новый URI.

Если код состояния 301 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был выполнен запрос.

Сравните это с HTTP 302 Found redirect, который очень часто используется при простой настройке «перенаправления» и который определяется как (опять же, мой акцент):

Запрашиваемый ресурс временно находится под другим URI. Поскольку перенаправление может иногда изменяться, клиент ДОЛЖЕН продолжать использовать Request-URI для будущих запросов. Этот ответ может быть кэширован, только если он указан в поле заголовка Cache-Control или Expires.

Временный URI ДОЛЖЕН быть задан полем Location в ответе. Если метод запроса не является HEAD, объект ответа ДОЛЖЕН содержать краткую гипертекстовую заметку с гиперссылкой на новый URI.

Если код состояния 302 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был выполнен запрос.

Следовательно, правильный путь для перенаправления HTTP в вашем сценарии — настроить веб-сервер так, чтобы он возвращал ответ 301, указывающий новое местоположение, а не 302 ответ. Способные клиенты будут хранить новый URL и использовать его для любых будущих запросов.

Хочу идеальный .htaccess!

Попытка номер раз создать почти идеальный htaccess tutorial

.htaccess — наш герой

Профессионалы знают, что такое htaccess. Тем кто собираются уйти с народ.ру на php-хостинг только предстоит узнать, что это такое. Те кто только что установил свои первые jooml’у или wordpress срочно должны узнать о нашем герое — htaccess

Зачем нам .htaccess ?

Представьте, что вы купили себе хостинг и кажется, почти обрели счастье. Но однажды (а может быть дважды, а может и трижды) ваш сайт перестает отвечать на запросы. Начинает медленно грузиться и вообще вести себя странно. А виртуальный хостинг это такая хитрая штука, что помимо вашего сайта на этом сервере находится ещё два десятка других сайтов. Все они разные по мощности, организованности и трафику. И когда ваш сосед по случайности, а может и умыслу запускает на своем хостинге сложные или избыточные в алгоритмах скрипты, это отзывается и на вас.

Или другой пример. Скажем ваш ресурс начинает набирать популярность, но переезжать на выделенный сервер ещё рано, а мощностей VPS уже не хватает. Вас очень может выручить htaccess.

А ещё htaccess может решить некоторые вопросы с безопасностью вашего сайта.

А ещё…

Хочу идеальный .htaccess !

Оказывается в интернете много различной противоречивой информации относительно того как использовать .htaccess. Пришлось долго и нудно экспериментировать, что бы понять что истино, а что ложно. В большинстве случаев авторы советов в своих блогах забывают упомянуть, что для работы определенных условий нужен тот или иной модуль Апача.

Впрочем хватит слов, пора к делу. Попробуем создать почти идеальный .htaccess

1. Первой строкой задаем основные опции:

Options All -ExecCGI -Indexes -Includes +FollowSymLinks

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

  • Опция -ExecCGI запрещает запуск CGI скриптов. Лучше разрешить только для конкретных папок. Повысит безопасность.
  • Опция -Indexes запрещает показывать содержимое каталогов, если в них нет индексного файла. На виртуальном хостинге обычно включена по умолчанию. Изменив минус на плюс +Indexes можете наоборот разрешить просмотр содержимого каталога (или каталогов).
  • Опция -Includes запрещает SSI. Если не знаете, что это — запрещайте (Можно поЯндексировать(!) по запросу Server Side Include если хотите узнать об этом побольше). Можно использовать опцию IncludesNOEXEC, которая разрешит использовать SSI без запуска скриптов.
  • Опция +FollowSymLinks позволяет использовать символические ссылки на файлы или каталоги, не находящиеся в пределах корня вашего сайта.

Примечание

Вы можете использовать htaccess с разными настройками для разных каталогов. В корне сайта вы можете объявить -Indexes, а в избранных каталогах создать ещё один файл .htaccess и в нем объявить +Indexes. Помните, что действие опций htaccess распространяет сверху вниз по дереву каталогов до самой глубокой вложенности, пока не будут отменены другим htaccess.

Необязательно полностью перечислять все опции в дочерних .htaccess если они не изменяются. Достаточно указать (переназначить) только те опции и директивы, которые изменяются. Остальные опции так же унаследуются от родителя.

Пример

Скажем, у вас есть вот такой путь /site/folder_one/subfolder/other/

В файле /site/.htaccess вы указываете:

Options -Indexes

Allow from all

В файле /site/folder_one/.htaccess указываете:

Deny from all

В файле /site/folder_one/subfolder/.index\.php$ http://www.black-web.ru/ [R=301,L]

</IfModule>

Обязательно не забыть про условие <IfModule mod_rewrite.c>. Не окажись у хостера данного модуля и ваш сайт станет выдавать 500-ую ошибку. Данный конкретный модуль входить в сборку Апача по-умолчанию. Ну а вдруг… Хостеры и их админы бывают всякие.

В данной части пользы больше для SEO. Модуль rewrite как следует из его названия занимается перенаправлениями (привет Кэпу).

В этой части файла мы указали две склейки: мы склеили ваш_сайт и www.ваш_сайт Даже если пользователь наберет ваш сайт без WWW его перебросить 301 редериктом на www.ваш_сайт.

А так же мы избавились /index.php в строке запроса. Если пользователь наберет www.ваш_сайт/index.php его перебросит (снова 301 редериктом) на www.ваш_сайт.

Теперь поисковики не будут путаться между www и не будут дублировать главную страницу в результатах индексирования вашего сайта. Гуглим СЕО склейки домена, если не понимаете зачем это нужно.

3. Кто в папке главный?

Если у вас папке есть файлы index.html и index.php (не знаю, зачем и кому такое было нужно, но не раз видел такое) то как указать серверу кто их них более индексный?

DirectoryIndex index.php

А ещё можно там указать скажем roosso.php и тогда набрав в строке запроса адрес сайт.бла/бла/бла/ вы увидете не index, а roosso

4. Ещё настройки…

<IfModule mod_setenvif.c>

SetEnv TZ Europe/Moscow

</IfModule>

ServerSignature Off

AddDefaultCharset UTF-8

Первая строчка устанавливает часовой пояс. Например в Apache 2.22.22 был баг связанный с этой опцией. Функции времени в php не работали, пока не установишь часовой пояс.

Вторая строка это подпись сервера. Вы их не раз видели на всяких системных страницах типа 500ой ошибки или 403ей. Обычно там какая-нибудь техническая информация и почта вебмастера. Я предпочитаю даже в таких мелочах скрывать данные о софте на сервере. Коллеги параноики меня поддержат.

Угадайте, что делает третья строка?

5. Когда нет доступа к php.ini

С помощью .htaccess мы так же можем управлять рядом настроек PHP. На виртуальном хостинге, как правило, нет возможности изменять настройки php.ini. Чаще всего этого и не требуется. Но все же есть ряд опций контроль над которыми может нам быть полезен. Например, увеличить лимит на загрузку файлов, или лимит передачи данным методом POST.

<ifModule mod_php.c>

php_value upload_max_filesize 32M

php_value post_max_size 10M

php_value default_charset utf-8

php_value max_execution_time 200

</ifModule>

Первая строчка разрешить загружать файлы размером до 32 Мегабайт. По умолчанию в php обычно это значение 8 или 16 мегабайт.

Второй строкой разрешаем постинг объемом до 10 мегабайт. По умолчанию это значение обычно 2 Мегабайта.

Третья строка устанавливает кодировку по используемую вашими скриптами. По своей сути она дублирует строку: «AddDefaultCharset UTF-8». Но я чаще прибегаю к установке кодировки именно через php.

Четвертой строкой изменяем лимит времени выделенный на выполнение скрипта. По умолчанию он обычно равен 30 секундам. Но иногда для выполнения каких нибудь сложных обработок требуется больше времени.

6. Типы файлов. Ловкость рук и ни какого мошенничества.

В моей практике случалось пару раз, что после какого либо обновления провайдером софта, слетали типы файлов. Хотя такое редко. За 10 лет, всего два случая. Но иногда мне нужно было заставить html работать как php. А иногда требуется научить апач различать типы файлов, которые ему неизвестно. (Как оказалось Апачу вообще мало что известно из редких типов файлов.) В такой ситуации нас спасет следующий код:

AddHandler application/x-httpd-php .html

AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi

AddType application/x-javascript .js

AddType text/css .css

AddType text/xml .xml

AddType application/octet-stream .doc .mov .avi .pdf .xls

# ForceType application/x-httpd-php

Первая строчка позволит нашим php файлам иметь расширение html, но выполняться как php. Полезно бывает во многих случаях. А в старые добрые когда поисковики индексировали ЧПУ лучше, такая строчка всегда приходила на выручку.

Мы можем переназначить, добавить или подменить любые типы файлов под удобные нам разрешения.

Интересный трюк

Кстати, вы можете легко написать к примеру вот такую строку:

AddHandler application/x-httpd-php .i

Потом переименовать все ваши файлы, изменив расширение на .i (не забыв конечно про ссылки) и адреса файлов у вас на сайте будут не сайт.мой/index.php?uri а сайт.мой/index.i?uri

Например я пишу

AddHandler application/x-httpd-php .roosso

и создаю в корне своего сайта файл alex.roosso внутри обычный php код. Это вроде как страница обо мне любимом. И в адресной строке она будет выглядеть как www.black-web.ru/alex.roosso (ссылка рабочая, можете посмотреть что это так).

Второй строкой указано, какие расширения файлов должны выполняться как cgi скрипты.

Третья, четвертая и пятая строки, на всякий случай уточняют мим-тип файлов с разрешением css, js, xml. Не путайте с присвоением заголовка в ответе сервера на запрос, как это сделано в первых двух строках.

Шестая строчка это участка, нужна если на вашем сайте есть скачиваемый для пользователей контент. Если добавить эту строку, то при обращении к данным файлам им будет предлагаться скачать их на компьютер, а не как это сейчас в современным браузерах куча плагинов, которые даже word открывают в браузере.

Седьмую строку я закомментировал. Это строчка в принудительно-добровольном порядке, будет все файлы с вашего сервера запустить как php. Её лучше использовать лишь в отдельных папках, при необходимости.

7. Знают взрослые и дети, что архивы меньше весят…

Полезно, когда ваши страницы загружаются быстрей. Поэтому люди и придумали архивировать файлы. А потом они ещё подумали и решили, что архивировать можно и страницы на сайтах и картинки. Причем делать это незаметно для пользователя, но существенно снижать трафик и ускорять загрузку страниц. Волшебные слова прозвучали, теперь обсудим, как это можно сделать.

У Апача есть два модуля сжатия. Оба не являются модулями по умолчанию, поэтому необязательно могут присутствовать у вашего провайдера. Но как показала практика у 99% провайдеров один из них стоит. Наиболее распространен mod_deflate. Что бы его с помощью сжимать весь контент на вашем сайте добавьте в .htaccess следующие строки:

<ifModule mod_deflate.c>

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript

</ifModule>

Как видите мы должны перечислить mime type файлов, которые следует подвергать сжатию. Сюда можно добавить и видео и картинки, но толку это даст мало. Потому что jpeg или gif уже сами по себе являются сжатыми форматами. Так же как avi или flv.Content-Encoding:.*gzip.*

</IfModule>

Данный модуль умеет работать с масками, что несомненно большой плюс. Да и синтаксис у него куда более гибкий чем у предыдущего. Но используют его реже. А по сжатию я даже не берусь судить, который из модулей лучше. Я сильной разницы не заметил при тестах.

8. А ещё быстрей можно?

Можно. Если применить кеширование страниц. У кеширования есть и плюсы и минусы, поэтому подходить к этому вопросу надо подготовившись. Для динамически обновляющегося сайт каждый 2-3 минуты, например популярного форума, нужно учесть, что пользователь должен видеть актуальную информацию. Но у любого сайт есть контент, который более или менее статичен. Например те же картинки, или файлы стилей. Поэтому нам потребуется по разному использовать кеширование различного содержимого на сайте. В html разметки мы всегда можем использовать meta теги. И через php мы может устанавливать заголовки ответа сервера. Остается вопрос, как быть с css, js, image и т.д. и т.п.

Помочь нам в этом могут два модуля: mod_headers и mod_expires которые могут установить заголовки в ответ сервера и подсказать вашему браузеру, что и как нужно кешировать. Один из модулей обычно стоит у провайдера, но как и в случае с любым модулем, который не входит в стандартную сборку Апача, 100% гарантии никто вам не даст. Поэтому снова во избежание 500й ошибки указывает условия для каждого из модулей.

<ifModule mod_headers.c>

#кэшировать html и htm файлы на один день

<FilesMatch «\.(html|htm)$»>

Header set Cache-Control «max-age=43200»

</FilesMatch>

#кэшировать css, javascript и текстовые файлы на одну неделю

<FilesMatch «\.(js|css|txt)$»>

Header set Cache-Control «max-age=604800»

</FilesMatch>

#кэшировать флэш и изображения на месяц

<FilesMatch «\.(flv|swf|ico|gif|jpg|jpeg|png)$»>

Header set Cache-Control «max-age=2592000»

</FilesMatch>

#отключить кэширование

<FilesMatch «\.(pl|php|cgi|spl|scgi|fcgi)$»>

Header unset Cache-Control

</FilesMatch>

</IfModule>

Вот такой синтаксис у mod_headers. Думаю по комментариям ясно что к чему.

В данной секции я отключил кеширование php файлов. Хотя по моему мнению небольшой временной интервал кеширования им не повредит. 5-30 секунд, это интервал времени, за который мало что меняется. А многие пользователи любят пользоваться клавишей back (вернуться назад). Чтобы не загружать им страницу второй раз, а подхватить её из кеша, разумный интервал кеширования все же уместен.

Во второй секции где идут условия для mod_expires я именно так и делаю — для php ставлю небольшой интервал кеширования.

<ifModule mod_expires.c>

ExpiresActive On

#по умолчанию кеш в 5 секунд

ExpiresDefault «access plus 5 seconds»

#кэшировать флэш и изображения на месяц

ExpiresByType image/x-icon «access plus 2592000 seconds»

ExpiresByType image/jpeg «access plus 2592000 seconds»

ExpiresByType image/png «access plus 2592000 seconds»

ExpiresByType image/gif «access plus 2592000 seconds»

ExpiresByType application/x-shockwave-flash «access plus 2592000 seconds»

#кэшировать css, javascript и текстовые файлы на одну неделю

ExpiresByType text/css «access plus 604800 seconds»

ExpiresByType text/javascript «access plus 604800 seconds»

ExpiresByType application/javascript «access plus 604800 seconds»

ExpiresByType application/x-javascript «access plus 604800 seconds»

#кэшировать html и htm файлы на один день

ExpiresByType text/html «access plus 43200 seconds»

#кэшировать xml файлы на десять минут

ExpiresByType application/xhtml+xml «access plus 600 seconds»

</ifModule>

9. Правила вежливого тона…

В процессе модернизации своего сайта, мы часто оставляем хвосты ввиде ссылок, которые ведут на страницы, которые мы удалили. Иногда такие ссылки идут с других сайтов или из поисковых систем. Что бы не терять пользователей вежливым тоном считается иметь собственные страницы для различного типа ошибок. Включая даже ошибки сервера. Например стандартное сообщение о 500й ошибки очень скучное и мрачное, и вряд ли вызовет у пользователя желание посетить вашу страницу ещё раз. Но в htaccess есть приемы, которые могут сделать даже эту страницу приветливей.

# Bad Rquest

ErrorDocument 400 /400.html

# Authorization Required

ErrorDocument 401 /401.html

# Forbidden

ErrorDocument 403 /403.html

# Not found

ErrorDocument 404 /404.html

# Method Not Allowed

ErrorDocument 405 /405.html

# Request Timed Out

ErrorDocument 408 /408.html

# Request URI Too Long

ErrorDocument 414 /414.html

# Internal Server Error

ErrorDocument 500 /500.html

# Not Implemented

ErrorDocument 501 /501.html

# Bad Gateway

ErrorDocument 502 /502.html

# Service Unavailable

ErrorDocument 503 /503.html

# Gateway Timeout

ErrorDocument 504 /504.html

Для 400-х ошибок можно использовать и динамические страницы на php. А вот для 500 лучше сделать на html и js. Это часть ошибок обычно связана с ошибками сервера (в большинстве случаев) и php или cgi как правило в такой ситуации не работают.

Если вам лень делать столько страниц устанавливайте страницей ошибок главную страницу своего сайта или карту сайта.

Все это вы делаете исключительно для людей. Поисковым роботам плевать на то есть у вас страницы ошибок или нет. Они видят ответ сервера с кодом ошибки и блокируют вашу страницу в поиск. Так что имейте ввиду, это не панацея. Это лишь вежливость к вашей аудитории и имидж вашего сайта.

10. Подведем итог

Знатоки понимают, что в этой статье описано далеко не все.index\.php$ http://www.black-web.ru/ [R=301,L]

</IfModule>

DirectoryIndex index.php

<IfModule mod_setenvif.c>

SetEnv TZ Europe/Moscow

</IfModule>

ServerSignature Off

#AddDefaultCharset UTF-8

<ifModule mod_php.c>

php_value upload_max_filesize 32M

php_value post_max_size 10M

php_value default_charset utf-8

php_value max_execution_time 200

</ifModule>

AddHandler application/x-httpd-php .html

AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi

AddType application/x-javascript .js

AddType text/css .css

AddType text/xml .xml

AddType application/octet-stream .doc .mov .avi .pdf .xls

# ForceType application/x-httpd-php

<ifModule mod_deflate.c>

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript

</ifModule>

<IfModule mod_gzip.Content-Encoding:.*gzip.*

</IfModule>

<ifModule mod_headers.c>

#кэшировать html и htm файлы на один день

<FilesMatch «\.(html|htm)$»>

Header set Cache-Control «max-age=43200»

</FilesMatch>

#кэшировать css, javascript и текстовые файлы на одну неделю

<FilesMatch «\.(js|css|txt)$»>

Header set Cache-Control «max-age=604800»

</FilesMatch>

#кэшировать флэш и изображения на месяц

<FilesMatch «\.(flv|swf|ico|gif|jpg|jpeg|png)$»>

Header set Cache-Control «max-age=2592000»

</FilesMatch>

#отключить кэширование

<FilesMatch «\.(pl|php|cgi|spl|scgi|fcgi)$»>

Header unset Cache-Control

</FilesMatch>

</IfModule>

<ifModule mod_expires.c>

ExpiresActive On

#по умолчанию кеш в 5 секунд

ExpiresDefault «access plus 5 seconds»

#кэшировать флэш и изображения на месяц

ExpiresByType image/x-icon «access plus 2592000 seconds»

ExpiresByType image/jpeg «access plus 2592000 seconds»

ExpiresByType image/png «access plus 2592000 seconds»

ExpiresByType image/gif «access plus 2592000 seconds»

ExpiresByType application/x-shockwave-flash «access plus 2592000 seconds»

#кэшировать css, javascript и текстовые файлы на одну неделю

ExpiresByType text/css «access plus 604800 seconds»

ExpiresByType text/javascript «access plus 604800 seconds»

ExpiresByType application/javascript «access plus 604800 seconds»

ExpiresByType application/x-javascript «access plus 604800 seconds»

#кэшировать html и htm файлы на один день

ExpiresByType text/html «access plus 43200 seconds»

#кэшировать xml файлы на десять минут

ExpiresByType application/xhtml+xml «access plus 600 seconds»

</ifModule>

# Bad Rquest

ErrorDocument 400 /400.html

# Authorization Required

ErrorDocument 401 /401.html

# Forbidden

ErrorDocument 403 /403.html

# Not found

ErrorDocument 404 /404.html

# Method Not Allowed

ErrorDocument 405 /405.html

# Request Timed Out

ErrorDocument 408 /408.html

# Request URI Too Long

ErrorDocument 414 /414.html

# Internal Server Error

ErrorDocument 500 /500.html

# Not Implemented

ErrorDocument 501 /501.html

# Bad Gateway

ErrorDocument 502 /502.html

# Service Unavailable

ErrorDocument 503 /503.html

# Gateway Timeout

ErrorDocument 504 /504.html

11. Послесловие.

Я старался не спешить в написании статьи и на это ушли почти сутки. Но все же где то я мог допустить ошибки в орфографии или пунктуации. Прошу не казнить, а миловать. А лучше писать в личку, что бы я поправил ошибки.

И напоследок для любителей экспериментов несколько строк .htaccess. Сужу по своему опыту — на практике знания усваиваются лучше чем в теории.(.*\.((js)|(css)))$ plugin/GzipFile.php?file=$1

RewriteRule \.css$ plugin/GzipFile.php?file=$1

RewriteRule \.js$ plugin/GzipFile.php?file=$1

</IfModule>

RedirectMatch 301 /blog(.*) http://www.black-web.ru/$1

P.S.

… Для тех у кого всё получилось, идём на www.webpagetest.org мерять красоту до и после.

Andrey_Zentavr

Кому надо берите полностью готовый .htaccess здесь

Данный файл показал самую высокую производительность на тестах.

Так же там куча всего закомментировано о чем я не упомянул в статье и что может пригодится в тех или иных случаях.

.htaccess — Как передать REQUEST_URI из htaccess в PHP

Я хочу передать %{REQUEST_URI} полный URL-адрес из .htaccess в папку/index.php и получить его с помощью $_SERVER['REQUEST_URI'] .

На самом деле вы не можете этого сделать (но я не думаю, что это то, что вы пытаетесь сделать — или даже хотите сделать — в любом случае). Для уточнения…

PHP superglobal $_SERVER['REQUEST_URI'] заполняется PHP, и это нельзя переопределить.

Хотя %{REQUEST_URI} (серверная переменная Apache ) и $_SERVER['REQUEST_URI'] (суперглобальный PHP) похожи , они ссылаются на разные значения:

  • %{REQUEST_URI} (переменная сервера Apache) — ссылается только на URL-путь (без строки запроса). Значение имеет %-декодирование. Если запрос перезаписывается, то он обновляется, чтобы содержать переписанный URL-адрес, а не URL-адрес исходного запроса.

  • $_SERVER['REQUEST_URI'] (суперглобальный PHP) — Содержит начальный URL-путь и строку запроса , запрошенную пользователем (не переписанный URL).Значение не является %-декодированным.

Если вы действительно хотите сослаться на переменную сервера Apache REQUEST_URI в PHP, вам нужно явно передать ее (возможно, как переменную среды или строку запроса) — но в зависимости от , когда вы «передадите это», вы можете в конечном итоге передаются разные значения. — [E=APACHE_REQUEST_URI:%{REQUEST_URI}]

И укажите это в PHP как getenv('APACHE_REQUEST_URI') .(index\.php)?$ папка/index.php [L,NE]

Этот внутренне переписывает любой запрос к корневому каталогу документа, который содержит строку запроса (все после ? ) на /folder/index.php . Когда строка запроса отсутствует, index.php в корне документа обслуживается как обычно.

Затем в /folder/index.php вы просто получаете доступ к $_SERVER['QUERY_STRING'] для доступа к строке запроса (строка для перенаправления).

php — URL-адрес htaccess переписывает путаницу с request_uri

Мне (иногда) каким-то образом удается успешно переписать URL, но я хочу понять суть того, что я на самом деле делаю.

Теперь, когда я ввожу http://localhost/admin/shop/ в адресную строку браузера, я хочу, чтобы мой htaccess переписывал URL-адрес как http://localhost/admin.php?page=shop поэтому в php я могу понять, что на самом деле имею дело со страницей магазина.admin/(.*)/$ admin?pval=$1 [l,nc] ### обратите внимание на удаление ‘\.php’

Таким образом, когда вы вводите «http://localhost/admin/shop/» в адресную строку, php $_SERVER['REQUEST_URI'] будет печатать точно /admin/shop/. Теперь, если предположить, что php REQUEST_URI такой же, htaccess REQUEST_URI должен быть таким же, верно? Я действительно не знаю, используют ли они разные двигатели, но это то, что кажется мне логичным. Итак, если предположить, что я прав, почему второй пример не работает, когда я удаляю расширение ‘.php» из RewriteCond и RewriteRule ? Кроме того, если бы у меня была возможность напечатать REQUEST_URI htaccess, что бы он на самом деле вывел на экран в приведенном выше примере?

PS: Я знаю, что в этом случае мне не нужно использовать htaccess, так как я могу создать папку внутри папки администратора и назвать ее магазином и так далее. Но дело в том, что у меня на самом деле нет папки администратора, так как я использую контроллеры и простой переключатель в admin.php, чтобы избежать создания миллионов папок внутри моего приложения.Просто мне это проще.

Разбор URI ЗАПРОСА .htaccess — Конфигурация сервера — Форумы SitePoint

лгомес #1

Привет, как дела?

Я пытаюсь внедрить систему «команд», которая позволяет кому-то в нашей организации создавать команды для настройки нашей домашней страницы.

В основном я хочу проанализировать, скажем:

http://www.edgeracing.com/cmdthiscommand/

, чтобы извлечь то, что находится между «… com/» и первым «/» после этого. В приведенном выше примере это будет «cmdthiscommand».

Как только я извлеку это, я хочу проверить, являются ли первые три буквы «cmd». В этом случае я бы начал разлагать это слово, чтобы извлечь «эту команду».

Затем завершите запрос, построив и передав команду следующим образом:

http://www.edgeracing.com/index.php?cmd=thiscommand

Я хочу сделать все это с помощью mod_rewrite в файле .htaccess.

Теперь важно отметить, что если слово, которое было извлечено (в данном случае «cmdthiscommand») не начинается с трех символов «cmd», я хочу, чтобы процесс перезаписи прервался, и чтобы обычные процедуры запроса продолжались по мере их выполнения. нормально делаю. Это означает, что если кто-то запросит http://www.edgeracing.com/support/, URL-адрес не будет переписан, и они действительно получат то, что предполагается в URL-адресе.

На данный момент мой файл .htaccess содержит следующее:

  Опции - Индексы
php_value include_path:/home/www/include:/home/www/db:/home/www/stats:/home/www/stats/support
ErrorDocument 400 /module/response/?cmd=badrequest
ErrorDocument 401 /module/response/?cmd=authorizationrequired
ErrorDocument 403 /module/response/?cmd=forbidden
ErrorDocument 404 /module/response/?cmd=notfound
ErrorDocument 408 /module/response/?cmd=requesttimedout
ErrorDocument 500 /module/response/?cmd=internalservererror
RewriteEngine включен
RewriteCond %{REQUEST_URI} ^/module/response/$ [NC]
RewriteCond %{QUERY_STRING} ^cmd=notfound$ [NC]
RewriteCond %{THE_REQUEST} ^GET[[:space:]](..*$ /media/image/spacer.gif [L]
  

Но я должен признать, что здесь применяются правила, которые фактически заменяют несуществующие или ошибочные запросы изображений для spacer.gif, созданные не мной. Заслуга должна принадлежать pippo (Советник года по Sitepoint).

Спасибо за помощь,

пиппо #2

Луис,
для достижения вашей первоначальной цели я бы использовал эти правила:

(./.]+)/?$ [NC] # а затем вызвать index.php, передав ему имя команды Правило перезаписи. /index.php?cmd=%1 [L]

, поэтому
example.net/cmdthis_is_a_command/
или
example.net/cmdthis_is_a_command
вызовет
/index.php?cmd=this_is_a_command

Имя команды не должно содержать точки./test/$#»> Заголовок всегда устанавливает X-Test1 «testdir» <Еще> Заголовок всегда устанавливает X-Test1 «testfile»

И когда я проверил, у меня сразу все заработало:

 $ curl-Ik http://192.168.1.10:8090/тест/файл.html
HTTP/1.1 200 ОК
Дата: пятница, 18 февраля 2067 г., 22:28:14 по Гринвичу
Сервер: Апач
X-Test1: тестовый файл <----
Последнее изменение: пн, 17 мая 2021 г., 20:04:13 по Гринвичу
ETag: "a-5c28c18f65152"
Допустимые диапазоны: байты
Длина содержимого: 10
Тип содержимого: текст/html

завиток -Ik http://192.168.1.10:8090/test/
HTTP/1.1 404 не найден
Дата: пятница, 25 февраля 2067 г., 13:45:34 по Гринвичу
Сервер: Апач
X-Test1: testdir <---
Тип содержимого: текст/html; кодировка = iso-8859-1
  

Хотя, Если в этом каталоге включен DirectoryIndex, это считается за загрузку файла (index.html по умолчанию) :

  curl-Ik http://192.168.1.10:8090/test/
HTTP/1.1 200 ОК
Дата: вторник, 22 февраля 2067 г./test/index.HTML$#">
        Заголовок всегда устанавливает X-Test1 "testdir"

<Еще>
        Заголовок всегда устанавливает X-Test1 "testfile"

  

И вы получите желаемый эффект:

  $ curl-Ik http://192.168.1.10:8090/test/
HTTP/1.1 200 ОК
Дата: пятница, 11 февраля 2067 г., 12:58:38 по Гринвичу
Сервер: Апач
X-Test1: тестовый каталог
Последнее изменение: пн, 17 мая 2021 г., 20:12:48 по Гринвичу
ETag: "9-5c28c37a406a4"
Допустимые диапазоны: байты
Длина содержимого: 9
Тип содержимого: текст/html
  

Надеюсь, это поможет.

.htaccess — Apache htaccess с несколькими %{REQUEST_URI} и несколькими %{REMOTE_ADDR}

.htaccess — Apache htaccess с несколькими %{REQUEST_URI} и несколькими %{REMOTE_ADDR} — Ошибка сервера
Сеть обмена стеками

Сеть Stack Exchange состоит из 179 сообществ вопросов и ответов, включая Stack Overflow, крупнейшее и пользующееся наибольшим доверием онлайн-сообщество, где разработчики могут учиться, делиться своими знаниями и строить свою карьеру.

Посетите биржу стека
  1. 0
  2. +0
  1. Войти
  2. Зарегистрироваться

Server Fault — это сайт вопросов и ответов для системных и сетевых администраторов.Регистрация занимает всего минуту.

Зарегистрируйтесь, чтобы присоединиться к этому сообществу

Любой может задать вопрос

Любой может ответить

Лучшие ответы голосуются и поднимаются на вершину

спросил

Просмотрено 1к раз

Может ли кто-нибудь помочь мне сделать это функциональным?

Цель состоит в том, чтобы предоставить список путей из черного списка ( {REQUEST_URI} ) и список IP-адресов из белого списка ( {REMOTE_ADDR} ) и соответственно заблокировать..*$ - [Л,Ф] Документ об ошибке 403 https://youtu.be/cQ_b4_lw0Gg

спросил 27 фев, 2020 в 20:24

Джей Джей

14977 бронзовых знаков

1

(Флаг NC не требуется в условиях IP..*$ — [Л,Ф] Документ об ошибке 403 https://youtu.be/cQ_b4_lw0Gg

ответ дан 28 фев 2020 в 17:57

Джей Джей

14977 бронзовых знаков

Ошибка сервера лучше всего работает с включенным JavaScript

Ваша конфиденциальность

Нажимая «Принять все файлы cookie», вы соглашаетесь с тем, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой использования файлов cookie.

Принять все файлы cookie Настроить параметры

 

HTTP-сервер Apache версии 2.4

Резюме

Модуль mod_rewrite использует перезапись на основе правил движок, основанный на анализаторе регулярных выражений PCRE, для перезаписи запрошенных URL-адресов на муха.По умолчанию mod_rewrite сопоставляет URL-адрес с файловой системой. дорожка. Однако его также можно использовать для перенаправления одного URL-адреса на другой URL-адрес или для вызова внутренней выборки прокси.

mod_rewrite обеспечивает гибкий и мощный способ управлять URL-адресами, используя неограниченное количество правил. Каждое правило может иметь неограниченное количество присоединенных условий правила, чтобы вы могли переписать URL на основе переменных сервера, переменных среды, заголовков HTTP или времени Марки.

mod_rewrite работает с полным URL-адресом, включая раздел информации о пути. Правило перезаписи может быть вызвано в httpd.conf или .htaccess . Сгенерированный путь правило перезаписи может включать строку запроса или может привести к внутреннему подобработка, перенаправление внешнего запроса или внутренний прокси пропускная способность.

Более подробная информация, обсуждение и примеры приведены в подробная документация mod_rewrite.

Темы

Директивы

Контрольный список исправлений

См. также

mod_rewrite предлагает подробное логирование своих действий на уровнях журнала от trace1 до trace8 . То уровень журнала может быть установлен специально для mod_rewrite с использованием директивы LogLevel : до уровень отладка , никакие действия не регистрируются, а trace8 означает, что практически все действия протоколируются.

Использование высокого уровня журнала трассировки для mod_rewrite значительно замедлит работу вашего HTTP-сервера Apache! Использовать журнал уровень выше trace2 только для отладки!

Пример

 Предупреждение LogLevel переписать: trace3 

Журнал перезаписи

Те, кто знаком с более ранними версиями mod_rewrite несомненно будет искать RewriteLog и RewriteLogLevel директивы.Эта функция была полностью заменена новая конфигурация ведения журнала для каждого модуля, упомянутая выше.

Чтобы получить только журнал mod_rewrite сообщения, передайте файл журнала через grep:

tail -f error_log|fgrep '[переписать:'

Директива RewriteBase определяет Префикс URL, который будет использоваться для каждого каталога (htaccess) Директивы RewriteRule , которые замените относительный путь.

Эта директива обязательна при использовании относительного пути в замене в контексте каждого каталога (htaccess), если нет из следующих условий:

  • Исходный запрос и замена находятся под Корень документа (в отличие от досягаемости другими средствами, такими как Псевдоним ).
  • файловая система путь к каталогу, содержащему Правило перезаписи , суффикс родственника замена также действительна как путь URL на сервере (это редкость).
  • В Apache HTTP Server 2.4.16 и более поздних версиях эта директива может быть опускается, когда запрос отображается через Псевдоним или mod_userdir .

В приведенном ниже примере необходимо RewriteBase чтобы избежать перезаписи на http://example.com/opt/myapp-1.2.3/welcome.html поскольку ресурс не относился к корню документа. Этот неправильная конфигурация обычно приводит к тому, что сервер ищет «opt» каталог в корне документа.индекс\.html$» «welcome.html»

Директива RewriteCond определяет условие правила. Один или несколько RewriteCond может предшествовать RewriteRule директива. Следующее правило используется, только если оба текущее состояние URI соответствует его шаблону, и , если эти условия выполняются.

TestString — это строка, которая может содержать следующие расширенные конструкции в дополнение к простому тексту:

  • обратные ссылки RewriteRule : это обратные ссылки вида $N (0 <= Н <= 9).От $1 до $9 обеспечивают доступ к сгруппированным части (в скобках) узора, из RewriteRule , на который распространяется текущий набор условий RewriteCond . $0 обеспечивает доступ ко всей строке, соответствующей этому шаблону.
  • Обратные ссылки RewriteCond : Это обратные ссылки вида %N (0 <= Н <= 9). от %1 до %9 предоставляют доступ к сгруппированным части (опять же в скобках) шаблона, начиная с последнего сопоставленного RewriteCond в текущем наборе условий.%0 предоставляет доступ ко всей строке, соответствующей этот узор.
  • Расширения RewriteMap : Это расширения вида ${mapname:key|default} . См. документацию для RewriteMap для более подробной информации.
  • Server-Variables : Это переменные форма %{ NAME_OF_VARIABLE } где NAME_OF_VARIABLE может быть взятой строкой из следующего списка:
    Заголовки HTTP: соединение и запрос:
    HTTP_ACCEPT
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_REFERER
    HTTP_USER_AGENT
    Auth_type
    conn_remote_addr
    context_prefix
    context_document_root
    ipv6
    path_info
    path_info
    query_string
    Remote_addr
    Remote_host
    Remote_ident
    Remote_port
    Remote_User
    Request_method
    Script_filename
    внутренние компоненты сервера: дата и время: специальные предложения:
    DOCUMENT_ROOT
    SCRIPT_GROUP
    SCRIPT_USER
    SERVER_ADDR
    SERVER_ADMIN
    SERVER_NAME
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
    API_VERSION
    CONN_REMOTE_ADDR
    HTTPS
    IS_SUBREQ
    REMOTE_ADDR
    REQUEST_FILENAME
    REQUEST_SCHEME
    REQUEST_URI
    THE_REQUEST

    Все эти переменные соответствуют одноименному протоколу HTTP MIME-заголовки, переменные C HTTP-сервера Apache или struct tm полей системы Unix.Большинство из них задокументировано здесь или в другом месте в Руководстве или в спецификации CGI.

    SERVER_NAME и SERVER_PORT зависят от значений UseCanonicalName и UseCanonicalPhysicalPort соответственно.

    Те, которые являются специальными для mod_rewrite , включают приведенные ниже.

    API_ВЕРСИЯ
    Это версия API модуля Apache httpd. (внутренний интерфейс между сервером и модуль) в текущей сборке httpd, как определено в включить/ap_mmn.час Версия API модуля соответствует используемой версии Apache httpd (в релизная версия Apache httpd 1.3.14, для например, это 199

    :10), но в основном интерес к авторам модулей.

    CONN_REMOTE_ADDR
    Начиная с версии 2.4.8: одноранговый IP-адрес соединения (см. модуль mod_remoteip ).
    HTTPS
    Будет содержать текст «включено», если соединение с использованием SSL/TLS или «выключено» в противном случае.(Эта переменная можно безопасно использовать независимо от того, загружен mod_ssl ).
    IS_SUBREQ
    Будет содержать текст «true», если запрос в настоящее время обрабатывается подзапрос, «ложь» в противном случае. Подзапросы могут быть сгенерированы модулями, которым необходимо разрешать дополнительные файлы или URI для выполнения своих задач.
    УДАЛЕННЫЙ_АДРЕС
    IP-адрес удаленного хоста (см. модуль mod_remoteip ).
    REQUEST_FILENAME
    Полный путь локальной файловой системы к файлу или скрипт, соответствующий запросу, если он уже был определен сервером в то время REQUEST_FILENAME упоминается.Иначе, например, при использовании в контексте виртуального хоста, тот же значение как REQUEST_URI . В зависимости от значения AcceptPathInfo , сервер мог использовать только некоторые основные компоненты REQUEST_URI для сопоставления запроса с файлом.
    ЗАПРОС_СХЕМА
    Будет содержать схему запроса (обычно «http» или «https»).На это значение можно повлиять с помощью ИмяСервера .
    REQUEST_URI
    Компонент пути запрошенного URI, например «/index.html». Это, в частности, исключает строка запроса, которая доступна как собственная переменная с именем QUERY_STRING .
    ЗАПРОС
    Полная строка HTTP-запроса, отправленная браузер на сервер (т.г., « ПОЛУЧИТЬ /index.html HTTP/1.1 «). Это не включать любые дополнительные заголовки, отправленные браузер. Это значение не было экранировано (декодировано), в отличие от большинства других переменных ниже.

Если TestString имеет специальное значение expr , CondPattern будет рассматриваться как ap_expr. Заголовки HTTP, указанные в выражение будет добавлено к заголовку Vary, если novary флаг не дан.

Другие вещи, о которых вы должны знать:

  1. Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одно и то же значение — значение имя файла поле внутреннего request_rec Структура HTTP-сервера Apache. Первое имя является общеизвестным именем переменной CGI. в то время как второй является подходящим аналогом REQUEST_URI (который содержит значение uri поле request_rec ).

    Если произошла замена и перезапись продолжается, значение обеих переменных будет соответствующим образом обновлено.

    Если используется в контексте для каждого сервера ( т.е. , перед запрос сопоставляется с файловой системой) SCRIPT_FILENAME и REQUEST_FILENAME не может содержать полную локальную файловую систему путь, поскольку на данном этапе обработки путь неизвестен. Обе переменные изначально будут содержать значение REQUEST_URI. в таком случае.Чтобы получить полную локальную файловую систему путь запроса в контексте каждого сервера, используйте URL-адрес просмотр вперед %{LA-U:REQUEST_FILENAME} для определения окончательное значение REQUEST_FILENAME.

  2. %{ENV:переменная} , где переменная может быть любая переменная среды также доступна. Это просматривается через внутренний Структуры Apache httpd и (если их там нет) через getenv() из процесса сервера Apache httpd.
  3. %{SSL:переменная} , где переменная — это имя среды SSL переменная, может использоваться независимо от того, mod_ssl загружается, но всегда будет расширяться до пустая строка, если это не так. Пример: %{SSL:SSL_CIPHER_USEKEYSIZE} может расширяться до 128 . Эти переменные доступны даже без установка параметра StdEnvVars Директива SSLOptions .
  4. %{HTTP:header} , где заголовок может быть любое имя HTTP MIME-заголовка, всегда можно использовать для получения значение заголовка, отправляемого в HTTP-запросе. Пример: %{HTTP:Proxy-Connection} значение HTTP-заголовка « Прокси-соединение: ».

    Если заголовок HTTP используется в условии, к которому добавляется этот заголовок заголовок Vary ответа в случае, если условие оценивает значение true для запроса.Добавляется , а не , если условие оценивается как ложное для запроса. Добавление HTTP-заголовка к заголовку Vary ответа необходимо для правильного кэширования.

    Необходимо помнить, что состояния следуют за коротким замыканием. логика в случае флага ‘ ornext|OR ‘ так что некоторые условия могут вообще не оцениваться.

  5. %{LA-U:переменная} может использоваться для прогнозов, которые выполняют внутренний (на основе URL) подзапрос для определения окончательного значение переменной .Это можно использовать для доступа переменная для перезаписи, которая недоступна в данный момент этап, но будет установлен на более позднем этапе.

    Например, чтобы переписать в соответствии с REMOTE_USER переменная из для каждого сервера (файл httpd.conf ), вы должны используйте %{LA-U:REMOTE_USER} — это переменная устанавливается фазами авторизации, которые приходят после фаза преобразования URL (во время которой mod_rewrite работает).

    С другой стороны, поскольку mod_rewrite реализует его контекст для каждого каталога (файл .htaccess ) через этап исправления API и поскольку авторизация фазы приходят с до на этой фазе, вы просто можете использовать %{REMOTE_USER} в этом контексте.

  6. %{LA-F:переменная} может использоваться для выполнения внутреннего (на основе имени файла) подзапрос, чтобы определить окончательное значение переменная .В большинстве случаев это то же самое, что и ЛА-У выше.

CondPattern — шаблон условия, регулярное выражение, которое применяется к текущий экземпляр TestString . TestString сначала оценивается, а затем сопоставляется с CondPattern .

CondPattern обычно perl-совместимое регулярное выражение , но есть дополнительный синтаксис, доступный для выполнения других полезных тестов против тестовая строка :

  1. Перед строкой шаблона можно поставить префикс ‘ ! ‘символ (восклицательный знак) для отрицания результата условия, независимо от того, какой тип CondPattern используется.
  2. Вы можете выполнять лексикографические сравнения строк:
    <КондПаттерн
    Лексикографически предшествует
    Обрабатывает CondPattern как простую строку и лексикографически сравнивает его с TestString . Верно, если TestString лексикографически предшествует CondPattern .
    >КондПаттерн
    Лексикографически следует за
    Обрабатывает CondPattern как простую строку и лексикографически сравнивает его с TestString .Верно, если TestString лексикографически следует CondPattern .
    =Состояние
    Лексикографически равно
    Обрабатывает CondPattern как простую строку и лексикографически сравнивает его с TestString . Верно, если TestString лексикографически равно CondPattern (две строки точно равно, символ за символом).Если CondPattern это "" (две кавычки) это сравнивает TestString с пустой строкой.
    <=CondPattern
    Лексикографически меньше или равно
    Обрабатывает CondPattern как простую строку и лексикографически сравнивает его с TestString . Истинный если TestString лексикографически предшествует CondPattern или равно CondPattern (две строки равны, символ за символом).
    >=CondPattern
    Лексикографически больше или равно
    Обрабатывает CondPattern как простую строку и лексикографически сравнивает его с TestString . Истинный если TestString лексикографически следует CondPattern или равно CondPattern (две строки равны, символ за символом).

    Примечание

    Оператор сравнения строк является частью CondPattern аргумент и должен быть заключен в кавычки, если они используются.Например.
     RewriteCond %{HTTP_USER_AGENT} "= Этот робот/1.0" 
  3. Вы можете выполнять целочисленные сравнения:
    -экв
    Числовое значение равно ual to
    TestString рассматривается как целое число и численно по сравнению с CondPattern . Верно, если они численно равны.
    -ге
    Числовое значение г больше или e соответствует
    TestString рассматривается как целое число и численно по сравнению с CondPattern .Верно, если TestString численно больше или равно к CondPattern .
    -gt
    Числовое значение равно g reater t han
    TestString рассматривается как целое число и численно по сравнению с CondPattern . Верно, если TestString численно больше, чем CondPattern .
    -ле
    Числовое значение l меньше или e равно
    TestString рассматривается как целое число и численно по сравнению с CondPattern . Верно, если TestString численно меньше или равно к CondPattern . Избегайте путаницы с -l с помощью -L или -h вариант .
    Числовое значение l ess t han
    TestString рассматривается как целое число и численно по сравнению с CondPattern . Верно, если TestString численно меньше, чем CondPattern . Избегайте путаницы с -l с помощью -L или -h вариант .
    -не
    Числовое значение n или e равно
    TestString рассматривается как целое число и численно по сравнению с CondPattern . Верно, если они численно разные. Это эквивалентно !-экв .
  4. Вы можете выполнять различные проверки атрибутов файла:
    Is d каталог.
    Обрабатывает TestString как путь и тесты независимо от того, существует ли он, и является ли он каталогом.
    Обычный f ил.
    Обрабатывает TestString как путь и тесты независимо от того, существует ли он, и является ли он обычным файлом.
    Существующий файл через подзапрос.
    Проверяет, является ли TestString допустимым файлом, доступны через все сконфигурированные в данный момент сервера средства управления доступом для этого пути.При этом используется внутренний подзапрос на проверку, поэтому используйте его с осторожностью — это может повлиять на производительность вашего сервера!
    Символическая ссылка, соглашение bash.
    См. -1 .
    Символический л чернил.
    Обрабатывает TestString как путь и тесты независимо от того, существует ли он или нет, и является ли он символической ссылкой.Также может используйте соглашение bash -L или -h , если есть вероятность путаницы например, при использовании -lt или -ле тестов.
    Символическая ссылка, соглашение bash.
    См. -1 .
    Обычный файл с размером s .
    Обрабатывает TestString как путь и тесты независимо от того, существует ли он, и является ли он обычным файлом большего размера чем ноль.

    Существующий URL-адрес через подзапрос.
    Проверяет, является ли TestString допустимым URL-адресом, доступны через все сконфигурированные в данный момент сервера средства управления доступом для этого пути. При этом используется внутренний подзапрос на проверку, поэтому используйте его с осторожностью — это может повлиять на производительность вашего сервера!

    Этот флаг только возвращает информацию о вещах как контроль доступа, аутентификация и авторизация.Этот флаг не возвращает информацию о коде состояния настроенный обработчик (статический файл, CGI, прокси и т. д.) будет иметь вернулся.

    Имеет разрешения для исполняемых файлов e x .
    Обрабатывает TestString как путь и тесты независимо от того, существует ли он и имеет ли права на выполнение. Эти разрешения определяются в соответствии с базовой ОС.(.+) /другое/архив/$1 [R]
  5. Если TestString имеет специальное значение expr , CondPattern будет рассматриваться как ap_expr.

    В приведенном ниже примере -strmatch используется для сравнить REFERER с именем хоста сайта, для блокировки нежелательных хотлинков./$» «/homepage./$» «/homepage.std.html» [L]

    Объяснение: Если вы используете браузер, который идентифицирует себя в качестве мобильного браузера (обратите внимание, что пример неполный, так как есть много других мобильных платформ), мобильная версия домашняя страница обслуживается. В противном случае обслуживается стандартная страница.

    Директива RewriteEngine включает или отключает механизм перезаписи во время выполнения. Если он установлен на выкл. этот модуль не выполняет обработку во время выполнения все.Он даже не обновляет SCRIPT_URx переменные окружения.

    Используйте эту директиву для отключения правил в определенном контексте, вместо того, чтобы комментировать все директивы RewriteRule .

    Обратите внимание, что конфигурации перезаписи не наследуется виртуальными хостами. Это означает, что вам необходимо иметь RewriteEngine в директиве для каждого виртуального хоста в котором вы хотите использовать правила перезаписи.

    Директивы RewriteMap типа прг не запускаются во время инициализации сервера, если они определены в контекст, в котором RewriteEngine не установлен на на

    Описание: Определяет функцию отображения для поиска по ключу [ MapTypeOptions ]
    контекст: контекст: сервера конфигурации, виртуальный хост
    Статус
    MOD_REWRITE MOD_REWRITE
    Совместимость: 3-й параметр, MapTyPeoptions, в доступе Апачи 2.4.29 и выше

    Директива RewriteMap определяет Перезапись карты , которую можно использовать внутри правила подстановка строк функциями отображения на вставлять/заменять поля с помощью поиска по ключу. Источник этот поиск может быть разных типов.

    MapName название карты и будет использоваться для указания Mapping-функция для подстановки строк перезаписи правило через одну из следующих конструкций:

    ${ MapName : LookupKey }
    ${ MapName : LookupKey | Значение по умолчанию }

    Когда возникает такая конструкция, карта MapName консультируются, и ключ LookupKey просматривается.Если ключ найден, конструкция map-функции заменяется на SubstValue . Если ключ не найден, значит заменяется на DefaultValue или на пустую строку если не было указано DefaultValue . Пустые значения вести себя так, как будто ключ отсутствует, поэтому невозможно различать ключи с пустыми значениями и отсутствующие ключи.

    Например, вы можете определить Переписать карту как:

     Пример карты RewriteMap "txt:/путь/к/файлу/карте./ex/(.*)" "${examplemap:$1}" 

    Значение аргумента MapTypeOptions зависит от конкретный MapType . См. Использование RewriteMap для больше информации.

    Следующие комбинации для MapType и MapSource можно использовать:

    текст
    Простой текстовый файл, содержащий разделенные пробелами пары «ключ-значение». пар, по одному на строку. (Подробнее…)
    рнд
    Произвольно выбирает запись из простого текстового файла (Details …)
    дбм
    Ищет запись в файле dbm, содержащую имя, значение пары. Хэш создается из формата простого текстового файла с использованием httxt2dbm полезность. (Подробнее…)
    между
    Одна из четырех доступных внутренних функций, предоставляемых RewriteMap : toupper, tolower, escape or убежать. (Подробнее…)
    прг
    Вызывает внешнюю программу или сценарий для обработки переписывание.(Подробнее…)
    дбд или фастдбд
    Оператор SQL SELECT, который необходимо выполнить для поиска переписать цель. (Подробнее…)

    Дополнительную информацию и многочисленные примеры можно найти в RewriteMap HowTo

    .

    Директива RewriteOptions устанавливает некоторые специальные параметры для текущего сервера или каталога конфигурация. Строка Option в настоящее время может быть только одним из следующих:

    Наследовать

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

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

    Наследовать до

    Аналогично Наследует выше, но правила из родительской области применяются до правил, указанных в дочерней области.
    Доступно в Apache HTTP Server 2.3.10 и более поздних версиях.

    InheritDown

    Если этот параметр включен, все дочерние конфигурации будут наследовать конфигурация текущей конфигурации. Это эквивалентно указание RewriteOptions Inherit во всех дочерних конфигурации. Дополнительные сведения см. в разделе «Наследовать ». как устроены отношения родитель-потомок.
    Доступно в Apache HTTP Server 2.4.8 и выше.

    InheritDownBefore

    Аналогично InheritDown выше, но правила из текущего применяются до правил, указанных в любом дочернем объем.
    Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.

    ИгнорироватьНаследование

    Этот параметр заставляет текущую и дочернюю конфигурации игнорировать все правила, которые будут унаследованы от родителя, указывающего InheritDown или InheritDownBefore .
    Доступно в Apache HTTP Server 2.4.8 и более поздних версиях.

    Алловбез косой черты

    По умолчанию mod_rewrite игнорирует URL-адреса, каталог на диске, но без косой черты в конце, в ожидании, что модуль mod_dir выдаст клиенту перенаправление на канонический URL с косой чертой в конце.

    Когда директива DirectorySlash выключен, можно включить параметр AllowNoSlash , чтобы обеспечить что правила перезаписи больше не игнорируются.Этот вариант дает возможность применять правила перезаписи в файлах .htaccess, которые соответствуют каталогу без завершающая косая черта, если это необходимо.
    Доступно в Apache HTTP Server 2.4.0 и более поздних версиях.

    Разрешить любой URI

    Когда Правило перезаписи используется в VirtualHost или контексте сервера с httpd версии 2.2.22 или выше, mod_rewrite будет обрабатывать правила перезаписи только в том случае, если URI запроса является URL-путем.Это позволяет избежать некоторые проблемы безопасности, когда определенные правила могут позволить «неожиданные» расширения шаблона (см. CVE-2011-3368 и CVE-2011-4317). Чтобы снять ограничение на сопоставление URL-пути, Опция AllowAnyURI может быть включена, и mod_rewrite применит набор правил к любому запрашивать строку URI, независимо от того, соответствует ли эта строка грамматика URL-пути, требуемая спецификацией HTTP.
    Доступно в Apache HTTP Server 2.4.3 и выше.

    Предупреждение безопасности

    Включение этой опции сделает сервер уязвимым для проблемы безопасности при использовании с правилами перезаписи, которые не тщательно автором. настоятельно рекомендуется что эта опция не используется. В частности, остерегайтесь ввода строки, содержащие символ ‘ @ ‘, которые могут изменить интерпретацию преобразованного URI в соответствии с над именами CVE.

    База слияния

    С этой опцией значение RewriteBase копируется из того места, где оно явно определено в любой подкаталог или подместо, которое не определяет свой собственный RewriteBase .Это было поведение по умолчанию в версиях с 2.4.0 по 2.4.3, и флаг для его восстановления доступен Apache HTTP Server 2.4.4 и выше.

    Игнореконтекстинфо

    Когда производится относительная замена в контексте каталога (htaccess) и RewriteBase не был установлен, этот модуль использует некоторые расширенный URL-адрес и информация о контексте файловой системы для изменения относительная замена обратно в URL.Модули, такие как mod_userdir и mod_alias предоставить эту расширенную контекстную информацию. Доступно в версии 2.4.16 и выше.

    LegacyPrefixDocRoot

    До версии 2.4.26, если подстановка представляла собой абсолютный URL-адрес, текущий виртуальный хост, URL-адрес может быть сначала сокращен до URL-пути а затем позже сведен к локальному пути. Поскольку URL-адрес можно уменьшить к локальному пути, путь должен начинаться с корня документа.Это предотвращает доступ к такому файлу, как /tmp/myfile, когда делается запрос на http://host/file/myfile со следующим Правило перезаписи .

     RewriteRule /file/(.*) http://localhost/tmp/$1 

    Этот параметр позволяет использовать старое поведение там, где документ root не имеет префикса локального пути, который был сокращен из URL. Доступно в версии 2.4.26 и более поздних.

    Директива RewriteRule является реальной рабочая лошадка переписка.Директива может встречаться более одного раза, с каждым экземпляром, определяющим одно правило перезаписи. То порядок, в котором эти правила определены, важен — это порядок в котором они будут применяться во время выполнения.

    Шаблон есть Perl-совместимый обычный выражение. То, с чем сравнивается эта модель, зависит от где определена директива RewriteRule .

    Что совпадает?

    • В контексте VirtualHost , Шаблон изначально будет сопоставляться с частью URL-адрес после имени хоста и порта и перед строкой запроса (например,грамм. «/app1/index.html»). Это (%-decoded) URL-путь.

    • В контексте каждого каталога ( Каталог и .htaccess), шаблон сопоставляется только с частичным путем, например с запросом «/app1/index.html» может привести к сравнению с «app1/index.html» или «index.html» в зависимости от того, где находится RewriteRule определенный.

      Путь к каталогу, в котором определено правило, удален из текущего сопоставленного путь файловой системы перед сравнением (до косой черты включительно).Конечным результатом этого удаления префиксов для каждого каталога является то, что правила в этот контекст соответствует только той части текущего сопоставленного пути к файловой системе «ниже», где определено правило.

      Директивы, такие как DocumentRoot и Alias ​​ , или даже результат предыдущих замен RewriteRule , определить текущий сопоставленный путь к файловой системе.

    • Если вы хотите сопоставить имя хоста, порт или строку запроса, используйте RewriteCond с %{HTTP_HOST} , %{SERVER_PORT} или %{QUERY_STRING} переменных соответственно.

    Перезапись для каждого каталога

    • Механизм перезаписи может использоваться в файлах .htaccess и в разделах с некоторыми дополнительными сложность.
    • Чтобы включить механизм перезаписи в этом контексте, необходимо установить » RewriteEngine на » и «Параметры FollowSymLinks » должны быть включены. Если ваш администратор отключил переопределение FollowSymLinks для каталог пользователя, то вы не можете использовать механизм перезаписи.Этот ограничение необходимо из соображений безопасности.
    • См. RewriteBase директива для получения дополнительной информации о том, какой префикс будет добавлен обратно к относительные замены.
    • Если вы хотите сопоставить полный URL-путь в каталоге (htaccess) RewriteRule, используйте переменную %{REQUEST_URI} в a RewriteCond .
    • Удаленный префикс всегда заканчивается косой чертой, что означает, что сопоставление происходит со строкой, которая никогда не имеет ведущей косой черты./ никогда соответствует контексту каталога.
    • Хотя правила перезаписи синтаксически разрешены в разделах и (включая их аналоги регулярных выражений), это никогда не должно быть необходимым и не поддерживается. Вероятная особенность break в этих контекстах является относительной заменой.
    • Если блоков следуйте правилам контекста каталога .
    • По умолчанию mod_rewrite переопределяет правила, когда объединение разделов, принадлежащих одному контексту.Директива RewriteOptions может изменить это поведение, например, используя настройку Наследовать .
    • RewriteOptions также регулирует поведение разделов, заявленных на одном уровне вложенности конфигурации. в следующем примере, по умолчанию только RewriteRules, указанные во втором Если блок учитываются, так как первые перекрываются. Использование RewriteOptions Inherit заставляет mod_rewrite объединить два разделы и рассмотреть оба набора утверждений, а не только последний.
     <Если "истина">
      # Без RewriteOptions Inherit это правило переопределяется следующим
      # и для URI, содержащих 'foo', перенаправление не произойдет
      RewriteRule foo http://example.com/foo [R]
    
    <Если "истина">
      Панель RewriteRule http://example.com/bar [R]
     

    Для некоторых советов по обычным выражения см. mod_rewrite Введение.

    В mod_rewrite символ НЕ (‘ ! ‘) также доступен в качестве возможного шаблона приставка.Это позволяет вам отрицать шаблон; сказать, например: « , если текущий URL-адрес НЕ соответствует этому узор ». Это можно использовать в исключительных случаях, когда легче сопоставить негативный паттерн или в последнюю очередь правило по умолчанию.

    Примечание

    При использовании символа НЕ для отрицания шаблона вы не можете включать сгруппированные части подстановочных знаков в этом шаблоне. Это потому, что, когда шаблон НЕ соответствует (т. е. совпадает отрицание), нет содержание для групп.Таким образом, если используются отрицательные шаблоны, вы нельзя использовать $N в строке подстановки!

    Замена правило перезаписи — это строка, заменяющая исходный URL-путь, совпадал с Pattern . Замена может быть:

    путь к файловой системе
    Указывает расположение ресурса в файловой системе. для доставки клиенту. Замены только рассматривается как путь к файловой системе, когда правило настроено в контекст сервера (виртуального хоста) и первый компонент путь в подстановке существует в файловой системе
    URL-путь
    A DocumentRoot -относительный путь к ресурс, который нужно обслуживать.Обратите внимание, что mod_rewrite пытается угадать, указали ли вы путь файловой системы или URL-путь, проверив, является ли первый сегмент путь существует в корне файловой системы. Например, если вы указываете строку Substitution из /www/file.html , то это будет рассматриваться как URL-путь , кроме каталога с именем www существует в корне или вашей файловой системе (или, в случае используя перезапись в .htaccess относительно ваш корень документа), и в этом случае он будет рассматриваться как путь файловой системы. Если вы желаете др. Директивы сопоставления URL-адресов (такие как Псевдоним ), применяемые к полученный URL-путь, используйте флаг [PT] как описано ниже.
    Абсолютный URL-адрес
    Если указан абсолютный URL, mod_rewrite проверяет, имя хоста соответствует текущему хосту.Если да, то схема и имя хоста удаляется, а полученный путь рассматривается как URL-путь. В противном случае выполняется внешнее перенаправление для указанный URL. Чтобы принудительно выполнить внешнее перенаправление обратно на текущий хост, см. флаг [R] ниже.
    - (тире)
    Прочерк означает, что подстановку выполнять не следует. (существующий путь пройден нетронутым). Это используется когда флаг (см. ниже) необходимо применить без изменения тропинка.

    В дополнение к обычному тексту строка Substitution может включать

    1. обратные ссылки ( $N ) на RewriteRule шаблон
    2. обратных ссылок ( %N ) на последнее совпадение Шаблон RewriteCond
    3. переменные сервера, как в тестовых строках условия правила ( %{ИМЯ ПЕРЕМЕННОЙ} )
    4. вызовы функции сопоставления ( $ {имя карты: ключ | по умолчанию} )

    Обратные ссылки являются идентификаторами формы $ Н ( N =0..9), который будет заменен по содержанию N -й группы соответствует шаблону . Серверные переменные одинаковы что касается TestString ПереписатьКонд директива. Функции отображения исходят из Переписать карту директивы и объясняются там. Эти три типа переменных раскрываются в указанном выше порядке.

    Правила перезаписи применяются к результатам предыдущей перезаписи правила в том порядке, в котором они определены в файле конфигурации.URL-путь или путь к файловой системе (см. «Что совпадает?» выше) полностью равен . заменил на Замена и процесс перезаписи продолжается до тех пор, пока не будут применены все правила, или он явно прекращен L флаг, или другой флаг, который подразумевает немедленное завершение, например КОНЕЦ или Ф .

    Изменение строки запроса

    По умолчанию строка запроса передается без изменений.Ты однако может создавать URL-адреса в строке подстановки, содержащей часть строки запроса. Просто используйте вопросительный знак внутри строка подстановки, чтобы указать, что следующий текст должен быть повторно введены в строку запроса. Когда вы хотите стереть существующая строка запроса, завершите строку подстановки только вопросительный знак. Чтобы объединить новые и старые строки запроса, используйте [QSA] флаг.

    Дополнительно можно установить специальные действия, которые будут выполняться добавление [ флаги ] в качестве третьего аргумента RewriteRule директива. Флаги — это список, разделенный запятыми, окруженный квадратом. скобки любого из флагов в следующей таблице. Более подробности и примеры для каждого флага доступны в документе Rewrite Flags.

    Б Экранирование не буквенно-цифровых символов в обратных ссылках до применяя преобразование. детали…
    backrefnoplus|BNP Если обратные ссылки экранируются, пробелы должны быть экранированы %20 вместо +.Полезно, когда обратная ссылка будет использоваться в компонент пути, а не строка запроса. детали…
    цепь|C Правило связано со следующим правилом. Если правило не работает, связанные с ним правила будут пропущены. детали…
    cookie|CO= ИМЯ : VAL Устанавливает файл cookie в браузере клиента. Полный синтаксис: CO= ИМЯ : VAL : домен [: время жизни [: путь [: безопасный [: httponly [ тот же сайт 90]]2] 0 подробности 9 …
    путь сброса|DPI Приводит к тому, что часть PATH_INFO переписанного URI становится отброшен. детали …
    КОНЕЦ Немедленно остановите процесс перезаписи и не применяйте больше правил. Также предотвращает дальнейшее выполнение правил перезаписи в контексте каждого каталога и .htaccess. (Доступно в версии 2.3.9 и выше) детали…
    env|E=[!] VAR [: VAL ] Вызывает установку переменной среды VAR (на значение VAL , если имеется).Форма ! VAR причины переменная окружения VAR не установлена. детали…
    запрещено|F Возвращает ответ 403 FORBIDDEN браузеру клиента. детали…
    ушел|G Возвращает ответ 410 GONE браузеру клиента. детали…
    Обработчик|H= Обработчик контента Вызывает отправку результирующего URI на указанный Контент-обработчик для обработки. детали…
    последний|L Немедленно остановите процесс перезаписи и не применяйте больше правил. Особо обратите внимание на предостережения для каждого каталога и контекст .htaccess (см. также флаг END). детали…
    следующий|N Повторно запустить процесс перезаписи, начиная с первого правило, используя результат набора правил в качестве начального точка. детали …
    без корпуса|NC Делает сравнение шаблонов нечувствительным к регистру. детали…
    без выхода|NE Запрещает mod_rewrite применять экранирование шестнадцатеричного кода специальные символы в результате перезаписи. детали…
    nosubreq|NS Приводит к пропуску правила, если текущий запрос является внутренний подзапрос. детали…
    прокси|P Принудительная внутренняя отправка URL-адреса подстановки в качестве прокси-сервера запрос. детали …
    сквозной|PT Принудительно возвращает результирующий URI обратно в URL механизм сопоставления для обработки других URI-имен файлов переводчики, такие как Псевдоним или Перенаправление . детали…
    qsappend|QSA Добавляет любую строку запроса из исходного URL-адреса запроса к любая строка запроса, созданная в цели перезаписи. детали…
    qsdiscard|QSD Отменить любую строку запроса, прикрепленную к входящему URI. детали …
    qslast|QSL Интерпретировать последний (самый правый) вопросительный знак как строку запроса разделитель вместо первого (самого левого), как обычно. Доступно в версии 2.4.19 и выше. детали …
    перенаправление|R[= код ] Принудительное внешнее перенаправление, необязательно с указанным Код состояния HTTP. детали …
    пропустить|S= число Сообщает модулю перезаписи пропустить следующее число . правила, если текущее правило соответствует. детали…
    тип|T= MIME-тип Принудительно указать MIME-тип целевого файла быть указанного типа. детали…

    Расширение домашнего каталога

    Когда строка подстановки начинается со строки напоминающий «/~user» (через явный текст или обратные ссылки), mod_rewrite выполняет расширение домашнего каталога независимо от наличия или конфигурации из mod_userdir .локальный путь (.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo через внутренний прокси-сервер

    Кто-нибудь разбирается в правилах перезаписи в Htaccess? | SEO-форум

    Эй, Дэвид,

    Извините за задержку с ответом.

    Прежде чем мы начнем, я должен отметить, что синтаксис htaccess очень специфичен, и вы должны быть предельно осторожны, когда с ним возитесь. даже один неуместный пробел может привести к массовым ошибкам.- Обозначает начало регулярного выражения (regex)
    / — буквально просто /
    (En|Es) — ‘()’ — это просто группировка, а ‘|’ означает ИЛИ. Итак, это говорит En OR Es
    $ — Обозначает конец регулярного выражения
    [NC] — Означает отсутствие регистра, поэтому все в этом не чувствительно к регистру

    Таким образом, буквально это означает выполнение этой перезаписи, когда запрошенный URI (после .com или любого другого TLD, который вы используете) является либо /En ИЛИ /Es, а затем любым другим, без учета случая

    Правило перезаписи ^(En|Es)/(.- Обозначает начало регулярного выражения (regex)
    (En|Es) — ‘()’ — это просто группировка, а ‘|’ означает ИЛИ. Итак, это говорит En OR Es
    / — буквально просто /
    (. ) — это подстановочный знак. Еще раз () — это группировка, но здесь . означает ноль или более произвольных символов
    $ — Обозначает конец регулярного выражения
    $2 — это вторая захваченная группа в этой строке. Это означает, что все, что определено в (.*), то есть все, что находится после En/ или Es/
    ?lang= — это буквально запись ‘?lang=’ без ‘s.
    $1 — это первая захваченная группировка из этой линейки. Значение того, какой En OR Es был захвачен, будет написано здесь.
    [L] — указывает серверу прекратить перезапись после обработки предыдущей директивы (правила).
    [R] — указывает Apache выполнить перенаправление, в результате чего браузер запрашивает перезаписанный URL-адрес.
    [301] — соответствует постоянно перемещенному Код заголовка
    [L, R = 301] — объединяет все 3 из них в один.

    Для этого, я думаю, проще всего использовать пример.
    moz.com/En/htaccess-is-fun будет нашим примером
    Поскольку этот URL-адрес передает RewriteCond, он переходит к RewriteRule, где находит En ИЛИ E и сохраняет это значение как $1 (En), а затем берет все, что осталось и сохраняет его как $2 (htaccess-is-fun).
    Затем он записывает htaccess-is-fun?lang=En и заменяет исходный выбор (то есть En/htaccess-is-fun) новым переписыванием, в результате чего получается moz.com/htaccess-is-fun?lang=En . Новый URL-адрес используется как перенаправление 301-ed.

    RewriteCond %{REQUEST_URI} !(.[a-zA-Z0-9]{1,5}|/)$

    RewriteCond — условие, при котором произойдет перезапись
    %{REQUEST_URI} — URI, запрашиваемый с сервера (все, что следует после домена и TLD, т. е. URI moz.com/community будет /community)
    ! — заявляет отрицание. т. е. «!cheese» соответствует всему, кроме «cheese»
    () — снова является группировкой
    \ — экранирует специальный символ. Так «.» означает буквальную точку.
    a-zA-Z0-9 — соответствует всем строчным буквам, всем прописным буквам и всем цифрам.
    {1,5} — соответствует от одного до пяти в предыдущем обозначении.- Обозначает начало регулярного выражения (regex)
    (.) — Это подстановочный знак. Еще раз () — это группировка, но здесь . означает ноль или более произвольных символов
    $ — Обозначает конец регулярного выражения
    $1 — это первая захваченная группировка из этой строки.
    / — буквально просто /
    [L] — указывает серверу прекратить перезапись после обработки предыдущей директивы (правила)
    [R] — указывает Apache выполнить перенаправление, заставляя браузер запрашивать переписанный URL-адрес
    [301] — Соответствует постоянно перемещенному коду заголовка
    [L, R = 301] — Объединяет все 3 из них в один.

    Таким образом, всякий раз, когда RewriteCond выполняется, это правило выбирает все, а затем перезаписывает его как 301 с / в конце.

Добавить комментарий

Ваш адрес email не будет опубликован.