Я пытаюсь настроить свой .htaccess для перенаправления всех файлов txt в корневом каталоге до 404 Ошибка. (Кроме robots.txt)
Я пробовал использовать RedirectMatch 404 [^robots]\.txt$
Но он также перенаправляет текстовые файлы в мои подкаталоги.
Спасибо.
Как насчет:
ErrorDocument 404 /404.php
RewriteEngine On
RewriteRule ^/robots\.txt$ /robots.real [L]
RewriteRule ^/[^/]*\.txt$ /404.php [L]
где 404.php
документ, возвращающий 404 и robots.real
это имя твоего robots.txt
.
Опустить первое ErrorDocument
, если вы не хотите создавать свою собственную страницу сообщения об ошибке, но обычно неплохо иметь ее, потому что вы можете иметь ее в своем собственном стиле, а также выполнять в ней логику для обнаружения орфографических ошибок и т. д.
Если подумать, вам, вероятно, вообще не нужно создавать страницу 404. Если вы используете mod_rewrite, чтобы вместо этого все текстовые документы загружали несуществующую страницу, например:
RewriteRule ^/[^/]*\.txt$ a-page-that-does-not-exist.html [L]
Причина, по которой ваш пример в вопросе не работает, заключается в том, что регулярное выражение [^robots]\.txt$
соответствует всему, что заканчивается символом кроме r, o, b, t, s, за которым следует .txt
. Добавляя ^/
перед этим вы сопоставите все однобуквенные (кроме robts) .txt файлы в корне.
В ^
в начале регулярного выражения означает начало URI, а внутри скобок означает «нет». Скобки означают «один из символов внутри».
Если вы добавите *
-sign к регулярному выражению, это означает ноль или более вхождений того, что непосредственно перед *
.
Таким образом, ^/[^r/obts]*\.txt$
будет соответствовать любым текстовым документам в корне, которые содержат любое количество (включая 0) любых символов, кроме [r, /, o, b, t, s], заканчивающихся на .txt
, например /zzzfile.txt
но нет /mysecretfile.txt
, потому что он содержит оба r
и t
и s
. Это тоже не совпадает /xyz/xyz.txt
, из-за /
внутри скобок. Это ближе к тому, что вы пытались сделать, но не исключает просто /robots.txt
, чего вы и хотите.
^/[^r/][^o/][^b/][^o/][^t/][^s/]\.txt$
соответствует любым 6 символам, кроме роботов (плюс расширение .txt).
Удаление этого файла будет иметь тот же эффект для HTTP-клиентов и, вероятно, будет проще.