У меня есть куча правил для разных категорий, вот одна категория …
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 — он не перенаправляет обратно на слова /
Итак, как я могу предотвратить прямой доступ людей к этим страницам, сохраняя при этом мои первоначальные намерения?
Вы можете создать «перенаправление» вверху файла, которое 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]
Других решений пока нет …