На сайте использую ЧПУ. Пример:
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-м редиректом полезна, когда у вас на сайте изменились адреса страниц, и есть задача "обучить" новым адресам поисковые системы, но не хочется терять трафик, идущий со старых ссылок на старые адреса.
Комментариев нет:
Отправить комментарий