- Настройка редиректов в htaccess
- Добавить www
- Для http:
- Для https:
- Удалить www
- Для http:
- Для https:
- Добавление слеша в конец URL
- Удаление слеша в конце URL
- Удаление повторяющихся слешей
- Редирект с index.php
- Для https:
- Редирект .htm на .html
- Замена .html на слеш
- Если расширение не .html то 404
- Редирект с одного домена на другой
- Директива RewriteCond
- Замечание
- Пример:
Настройка редиректов в htaccess
Как сделать seo редиректы на www или без него, добавление/удаление расширений у страниц.
Добавить www
Для http:
RewriteCond % !^www. RewriteRule (.*) http://www.%/$1 [R=301,L]
Для https:
RewriteCond % !^www. RewriteRule (.*) https://www.%/$1 [R=301,L]
Удалить www
Для http:
RewriteCond % ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Для https:
RewriteCond % ^www\.(.*) [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Добавление слеша в конец URL
RewriteBase / RewriteCond % !-f RewriteCond % !\.xml RewriteCond % !(.*)/$ RewriteRule ^(.*[^/])$ $1/ [L,R=301]
Иногда не работает с кириллическими доменами, возможен еще вариант:
RewriteCond % !-f RewriteCond % !\.xml RewriteCond % !(.*)/$ RewriteRule ^(.*)$ http://xn--80aswg.xn--p1ai/$1/ [L,R=301] # Для https: RewriteCond % !-f RewriteCond % !\.xml RewriteCond % !(.*)/$ RewriteRule ^(.*)$ http://xn--80aswg.xn--p1ai/$1/ [L,R=301]
Удаление слеша в конце URL
RewriteCond % ^(.*)/$ RewriteRule ^(.*)/$ /$1 [R=301,L]
Удаление повторяющихся слешей
Если нужно убрать несколько слешей, например https://example.com/sections///////// или https://example.com/////////sections/ .
RewriteCond % ([^\s]*)\/(\?[^\s]*)? RewriteRule (.*) %1 [R=301,L]
Редирект с index.php
RewriteCond % ^.*/index.php RewriteRule (.*) http://% [R=301,L]
Для https:
RewriteCond % ^.*/index.php RewriteRule (.*) https://% [R=301,L]
Редирект .htm на .html
RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteCond % \.htm$ RewriteRule ^(.*)\.htm$ $1.html [R=301,L]
Замена .html на слеш
RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteCond % \.html$ RewriteRule ^(.*)\.html$ $1/ [R=301,L]
Если расширение не .html то 404
RewriteCond % !-f RewriteCond % !-d RewriteCond % !\.html$ RewriteRule ^(.*)$ index.php?route=404 [L,QSA]
Редирект с одного домена на другой
Если к сайту привязаны несколько доменов, то следует сделать 301-й редирект на основной (например example.com на example.ru):
RewriteEngine On RewriteCond % example.com RewriteRule ^(.*)$ https://example.ru/$1 [R=301,L]
Директива RewriteCond
Директива RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы и также условиям этих дополительных директив.
СравниваемаяСтрока строка которая может содержать следующие дополнительные конструкции вдополении к простому тексту:
- RewriteRule обратные_связи: Это обратные связи вида $N (0 RewriteRule (единственной, следующей сразу затекущим набором директив RewriteCond ).
- RewriteCond обратные_связи: Это обратные связи вида %N (1 RewriteCond втекущем наборе условий.
- RewriteMap расширения: Это расширения вида $ Смотрите документацию по RewriteMap для получения более подробной информации.
- Переменные сервера: Это переменные вида %NAME_OF_VARIABLE > где NAME_OF_VARIABLE может быть строкой взятой из следующего списка:
HTTP заголовки: соединение & запрос: HTTP _USER_AGENT
HTTP _REFERER
HTTP _COOKIE
HTTP _FORWARDED
HTTP _HOST
HTTP _PROXY_CONNECTION
HTTP _ACCEPTREMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPEвнутренние сервера: системные: специальные: DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARETIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIMEAPI _VERSION
THE_REQUEST
REQUEST_ URI
REQUEST_FILENAME
IS_SUBREQЭти переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP , и переменным сервера Apache или полям struct tm систем Unix. Большинство из них документрованны в других местах руководства или в спецификации CGI . Те, что являются для mod_rewrite специальными включают: IS_SUBREQ Будет содержать текст true , если запрос выполняется в текущий момент как подзапрос, false – в другом случае. Подзапросы могут быть сгенерированы модулями, которым нужно иметь дело с дополнительными файлами, или URI для того, чтобы выполнить собственные задачи. API_VERSION Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h. API версия модуля соответствует используемой версии Apache (для версии Apache 1.3.14, к примеру это 19990320:10), однако это в основном интересно авторам модулей. THE_REQUEST Полная строка HTTP запроса, отправленная браузером серверу (т.е., GET /index.html HTTP/1.1 ). Она не включает какие-либо дополнительные заголовки, отправляемые браузером. REQUEST_URI Ресурс, запрошенный в строке HTTP запроса. (В примере выше, это было бы /index.html .) REQUEST_FILENAME Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
- Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е., значение поля filename внутренней структуры request_rec сервера Apache. Первое имя это просто широко известное имя переменной CGI в то время как второе это постоянная копия REQUEST_ URI (содержащая значение поля uri структуры request_rec ).
- Есть специальный формат: % где переменная может быть любой переменной окружения. Это ищется во внутренних структурах Apache и (если там нет) с помощью вызова getenv() из процесса Apache сервера.
- Есть специальный формат: % , где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется в HTTP запросе. Пример: % значение HTTP заголовка Proxy-Connection:.
- Есть специальный формат % опережающих запросов, которые производятся внутренним (основанном на URL ) подзапросом для определения конечного значения переменной. Используйте это, когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в какой-либо фазе API , и таким образом недоступна на данном этапе. Для примера, когда вы хотите преобразовать соответственно переменной REMOTE_USER из контекста сервера (файл httpd.conf ), вы должны использовать % , потому что эта переменная устанавливается в фазах авторизации, которые идут после фазы трансляции URL в которой иработает mod_rewrite. С другой стороны, по причине реализации работы mod_rewrite в контексте каталога (файл .htaccess ) через Fixup фазу API и из-за того, фазы авторизации идут до этой фазы, вы просто можете там использовать % .
- Есть специальный формат: % который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это тоже самое что и формат LA-U приведенный выше.
Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.
Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:
- Вы можете предварять строку шаблона префиксом ! (восклицательный знак) для указания несоответствия шаблону.
- Есть некоторые специальные варианты Условие. Вместо обычных строк с регулярными выражениями можно также использовать один из следующих вариантов:
- (лексически меньше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие. - >Условие (лексически больше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие. - =Условие (лексически равно)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ всимвол). Если Условие имеет вид «» (два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой. - -d (является ли каталогом)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является каталогом. - -f (является ли обычным файлом)
СравниваемаяСтрока считается путем, проверяется существование этого пути иточто этот путь является обычным файлом. - -s (является лиобычным файлом с ненулевым размером)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом, размер которого больше нуля. - -l (является лисимволической ссылкой)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является символической ссылкой. - -F (проверка существования файла через подзапрос)
Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим файлом, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью — это отрицательно сказывается напроизводительности сервера! - -U (проверка существования URL через подзапрос)
Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим URL , доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью — это отрицательно сказывается напроизводительности сервера!
- (лексически меньше)
Замечание
Все эти проверки также могут быть предварены префиксом восклицательный знак (‘!’) для инвертирования их значения.
Дополнительно вы можете устанавливать специальные флаги для Условие, добавляя
третьим аргументом в директиву RewriteCond. Flags список следующих флагов разделенных запятыми:
- nocase|NC (регистронезависимо)
Регистр не имеет значения, т.е., нет различий между ‘A-Z’ и’a-z’ как в дополнении СравниваемаяСтрока так и Условие. Этот флаг эффективен только для сравнений между СравниваемаяСтрока и Условие. Он не работает при проверках в файловой системе и в подзапросах. - ornext|OR (либо следующее условие)
Используйте для комбинирования условий в правилах OR вместо AND. Типичный пример:
RewriteCond % ^host1.* [OR] RewriteCond % ^host2.* [OR] RewriteCond % ^host3.* RewriteRule . some special stuff for any of these hosts.
Пример:
Для выдачи главной страницы сайта в зависимости от установки User-Agent: заголовка запроса, вы можете использовать следующие директивы:
RewriteCond % ^Mozilla.* RewriteRule ^/$ /homepage.max.html [L] RewriteCond % ^Lynx.* RewriteRule ^/$ /homepage.min.html [L] RewriteRule ^/$ /homepage.std.html [L]