如何使用 htaccess 匹配文件名的开头

如何使用 htaccess 匹配文件名的开头

我正在尝试修改.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>

相关内容