我有这棵树:
libs/
html/
app/
uploads/
files/
images/
male.png
female.png
.htaccess
download.php
.htaccess
index.php
/.htaccess
有这样的内容:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -Indexes
</IfModule>
RewriteEngine On
RewriteRule ^ index.php [END,L]
</IfModule>
我想要/uploads/.htaccess
:
重定向至
download.php
- 如果存在文件,但不存在这个
.htaccess
或download.php
- 如果存在文件,但不存在这个
重定向 404
- 如果不匹配现有的文件
- 或匹配
.htaccess
或download.php
- 或匹配现有文件夹
例子:
www.example.com/uploads - redirect 404
www.example.com/uploads/files - redirect 404
www.example.com/uploads/images- redirect 404
www.example.com/uploads/.htaccess - redirect 404
www.example.com/uploads/download.php - redirect 404
www.example.com/uploads/nonexistentfile - redirect 404
www.example.com/uploads/images/male.php - redirect download.php
www.example.com/uploads/images/female.php - redirect download.php
答案1
重定向到 download.php
我认为您的意思是“重写”,而不是外部的“重定向”。
我假设您的系统(即服务器配置)已配置(使用 mod_authz_...)以在尝试.htaccess
直接访问时返回 403 Forbidden。除非您有特定要求返回 404,否则我会保持原样。
重定向至 404
需要澄清的是,您并不是真正地“重定向”到 404,而只是“提供”404。如果您重定向到 404,那么您首先会将 3xx 响应发送回客户端,这是不可取的。
在/uploads/.htaccess
文件中尝试以下操作:
RewriteEngine On
# Rewrite request to download.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !download\.php$ download.php [L]
# Serve a 404 otherwise...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^ - [R=404]
第一条规则将所有尚未download.php
作为物理文件存在的请求重写为。(假设服务器配置正确,download.php
则对的请求应返回 403。).htaccess
第二条规则为所有其他“直接”请求提供 404 错误。检查环境变量的初始条件REDIRECT_STATUS
确保我们只检查直接请求,而不检查重写的请求(由较早的重写)。因此这包括:
- 直接请求
download.php
(但不重写请求download.php
)。 - 直接请求目录。
- 该请求未映射到文件(因为第一条规则已经失败)。