Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

.htaccess редирект средствами mod_rewrite

На сайте использую ЧПУ. Пример:
RewriteRule ^index$ index.php RewriteRule ^index/$ index.php
В итоге, в адресную строку можно легко вводить такой адрес http://site.ru/index. Но вот незадача. Как теперь сделать так, чтобы ссылка типа http://site.ru/index.php стала недоступной, а доступ ко странице index.php мог бы осуществлять только по адресу http://site.ru/index?


Ответ

Ваши два правила легко можно объединить в одно, взяв слеш в квадратные скобки и написав после них знак вопроса - это сделает его "необязательным" символом, который может быть, а может не быть.
По сути вопроса - например, так:
RewriteRule ^index[/]?$ index.php [L,E=ACCESS_ALLOWED:1] RewriteCond %{REQUEST_URI} ^/index.php$ RewriteCond %{ENV:REDIRECT_ACCESS_ALLOWED} ^$ RewriteRule ^index.php$ - [F]
Что тут происходит: первая строчка дублирует Ваши правила из вопроса, с той разницей, что при перенаправлении с index на index.php устанавливает переменную окружения ACCESS_ALLOWED со значением 1. Имя переменной можно выбрать произвольно - она не имеет значения для Apache, и нужна нам только в этих правилах.
Во второй и тертьей строчке задаются два условия: "запрошен URI index.php" и "значение переменной окружения ACCESS_ALLOWED пусто". В последней строчке запрещается доступ к index.php
Как это работает: при запросе index или index/ происходит перенаправление на index.php с установкой переменной ACCESS_ALLOWED, равной 1. Условие о пустой переменной ACCESS_ALLOWED, соответственно, не срабатывает, и обусловленное этим правило о запрете доступа к index.php не выполняется. При запросе же index.php напрямую переменная ACCESS_ALLOWED оказывается не установленной, условие о её пустоте срабатывает, и обусловленное им правило о запрете доступа к index.php выполняется. В итоге по запросу index попасть на index.php можно, а по "прямому" запросу index.php - нет.
Можно, на самом деле, поступить ещё изящнее: вместо запрета доступа "напрямую" к index.php просто перебрасывать такие запросы HTTP-редиректом на "рекомендуемый" index/, сделать это можно вот так:
RewriteRule ^index[/]?$ index.php [L,E=ACCESS_ALLOWED:1] RewriteCond %{REQUEST_URI} ^/index.php$ RewriteCond %{ENV:REDIRECT_ACCESS_ALLOWED} ^$ RewriteRule ^index.php$ index/ [L,R=301]
Такая схема с 301-м редиректом полезна, когда у вас на сайте изменились адреса страниц, и есть задача "обучить" новым адресам поисковые системы, но не хочется терять трафик, идущий со старых ссылок на старые адреса.

Комментариев нет:

Отправить комментарий