Переписать правила htaccess не работает идеально

У меня есть куча правил для разных категорий, вот одна категория …

RewriteRule ^words/$ /words/publicWordLists.php [L]
RewriteRule ^words/([A-Za-z]+$) /words/word.php?word=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/words/$ /words/userWordLists.php?username=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/words/([A-Za-z0-9-]+$) /words/list.php?username=$1&url=$2 [L]

Это прекрасно работает в том смысле, что если вы переходите к словам / вы получаете контент из publicWordsList.php — HOWEVER — если вы переходите непосредственно к /words/publicWordLists.php — он не перенаправляет обратно на слова /

Итак, как я могу предотвратить прямой доступ людей к этим страницам, сохраняя при этом мои первоначальные намерения?

1

Решение

Вы можете создать «перенаправление» вверху файла, которое 301 перенаправляет с «некрасивого» пути файловой системы к нужному URL. Тем не менее, вы должны быть осторожны с циклами перенаправления, так как позже перезапись переписывает URL снова.

Например:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^words/publicWordLists\.php$ /words/ [R=302,L]

Проверка по переменной среды REDIRECT_STATUS предотвращает цикл перенаправления, так как он смотрит только на начальный запрос, а не на переписанный запрос. REDIRECT_STATUS изначально пусто, но установлено на «200» после первого успешного перезаписи.

+ Изменить 302 (временно) в 301 (постоянный) только после того, как вы подтвердили, что все работает нормально — чтобы избежать потенциальных проблем с кэшированием.

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

Например:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^word=([a-zA-Z]+)$
RewriteRule ^words/word\.php$ /words/%1 [QSD,R=302,L]

Вышеуказанные перенаправления /word/word.php?word=<something> в /words/<something>,

%1 обратная ссылка на значение параметра URL, захваченное в предыдущем RewriteCond директивы. QSD Флаг необходим для удаления исходной строки запроса из перенаправленного запроса.

ОБНОВИТЬ: QSD флаг Apache 2.4+. Если вы все еще на Apache 2.2, то вместо этого вы можете добавить ? до конца замена строка (по сути пустая строка запроса), чтобы удалить строку запроса из перенаправленного URL. Например, на Apache 2.2 вам нужно это вместо этого:

RewriteRule ^words/word\.php$ /words/%1? [R=302,L]
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector