我正在尝试配置我的 .htaccess 以重定向所有 txt 文件在根目录至 404 错误。(robots.txt 除外)
我尝试使用
RedirectMatch 404 [^robots]\.txt$
但它也会重定向我子目录中的 txt 文件。
谢谢。
答案1
怎么样:
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 让所有 txt 文档都获取不存在的页面,例如:
RewriteRule ^/[^/]*\.txt$ a-page-that-does-not-exist.html [L]
问题中的示例失败的原因是因为正则表达式[^robots]\.txt$
匹配以 r,o,b,t,s 以外的字符结尾的所有内容.txt
。通过在此之前添加^/
,您将匹配根目录中的所有单字母(robts 除外).txt 文件。
正则^
表达式开头的 表示URI的开头,括号内的 表示“非”。括号表示“里面的字符之一”。
如果在正则表达式中添加一个*
“-”号,则表示在“-”之前紧接着出现零次或多次“- *
”
因此,^/[^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$
匹配除 robots 之外的任意 6 个字符(加上 .txt 扩展名)。
答案2
就 HTTP 客户端而言,删除这些文件将具有相同的效果,并且可能更容易。