目前,我的 php/apache 网络服务器的 http 根目录中存储了一些 zip 文件。
目前我可以使用以下命令访问文件:
http://example.com/filename.zip
但是,我想“保护”对这些文件的访问,并且只能使用类似以下方式访问它们:
http://example.com/key/filename.zip
有人可以帮我创建一个重写规则来做到这一点吗?
密钥是固定字符串。它将被硬编码在.htaccess
规则中。
当用户访问以下URL时:
http://example.com/key/filename.zip
他应该能够下载该 zip 文件。
当用户访问以下URL时:
http://example.com/filename.zip
他应该无法下载 zip 文件。他应该会收到 http 错误。
我迄今为止的代码:
RewriteEngine on
RewriteRule ^key/(\w+).zip $1.zip
答案1
/filename.zip
您现有的代码在访问时应该已经可以发挥作用/key/filename.zip
(尽管应该稍微整理一下)。
要阻止对的直接请求/filename.zip
,您可以在现有指令之前执行如下操作:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^/?\w+\.zip$ - [F]
这会阻止(403 禁止)全部直接请求表单的 URL /filename.zip
(在文档根目录中),无论它是否映射到现有文件。
或者,要发送 404,请将标志更改F
为R=404
。
总结一下:
RewriteEngine On
# Block direct requests to /<filename>.zip
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^/?\w+\.zip$ - [R=404]
# Internally rewrite /key/<filename>.zip to /<filename>.zip
RewriteRule ^/?key/(\w+)\.zip /$1.zip [L]
请记住使用反斜杠转义点以匹配文字点。
请注意,这将无条件重写对/key/<filename>.zip
的所有请求/<filename>.zip
,无论是否/<filename>.zip
存在。如果不存在,您只会得到 404。
L
如果您有其他后续指令,则可能需要该标志。
我已经修改了指令,以便它们可以在服务器配置中工作(以及.htaccess
)。