我正在尝试修改.htaccess
特定目录中的文件。如果网络用户尝试在此目录中找到任何可能以以下选项命名的文件,我希望他们被重定向回主页。以下是一些文件名示例。
/cat_1234.pdf
/cat_blahbla.doc
/cat_$9989&428.jpg
/cat_-309bn-020n.webp
...我该如何告诉我RewriteCond
要注意这些模式?这是我最好的尝试,我以为它会起作用,但事实并非如此...
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^cat_([0-9a-zA-Z_]+)\.(pdf|doc|jpg|webp) [NC]
RewriteRule . /index.php [R=302,L]
</IfModule>
我错过了什么?
答案1
您没有说明.htaccess
要保护的文件所在的“具体目录”吗?(尽管如果我们重新制定规则,那应该没关系。)
RewriteCond %{REQUEST_URI} ^cat_([0-9a-zA-Z_]+)\.(pdf|doc|jpg|webp) [NC] RewriteRule . /index.php [R=302,L]
服务器REQUEST_URI
变量包含完整的 URL 路径(包括斜杠前缀),因此这通常需要包含“特定目录”,而不仅仅是文件名(除非您调整正则表达式)。您在正则表达式上有一个字符串开头的锚点(尽管您省略了字符串结尾的锚点),因此这状况(RewriteCond
指令)永远不会匹配。
您的正则表达式也无法匹配第 3 和第 4 个示例,因为您的正则表达式字符类 ( [0-9a-zA-Z_]
) 省略了这些文件名中存在的特殊字符$
、&
和-
。不过我猜想您不需要这么具体,只要捕捉cat_<anything>.pdf
(例如)就可以了。
然而,你不需要单独的状况这里。使用RewriteRule
图案,匹配相对的到包含文件的目录.htaccess
(并排除斜杠前缀),因此您不必担心 URL 路径的其余部分。
我还怀疑您是否应该重定向到/index.php
。这难道不应该是简单的/
(根目录)并允许目录索引(即index.php
)由 mod_dir 提供服务吗?这不是您的规范 URL 吗?
.htaccess
在您保护的目录中的文件中尝试执行以下操作。
RewriteRule ^cat_[^/]+\.(pdf|doc|jpg|webp)$ / [R=302,L]
这个正则表达式可能比它需要的稍微宽泛一些,但这也使它更简单。即[^/]
匹配任何不是/
(路径分隔符)的内容。
不需要<IfModule>
包装器,除非此规则完全是可选的。
但是,我不会重定向到主页(这会让用户感到困惑,而对于机器人来说则没有必要),而是直接阻止(使用 403 Forbidden)此类请求。例如:
<FilesMatch "^cat_[^/]+\.(pdf|doc|jpg|webp)$">
Require all denied
</FilesMatch>