htaccess .zip url从/*.zip重写为/key/*.zip

目前我有一些zip文件存储在我的PHP / Apache Web服务器的http根。

目前我可以使用这个访问文件:

http://example.com/filename.zip 

但是,我想“保护”这个文件的访问权限,而且他们只能使用类似这样的方式进行访问:

 http://example.com/key/filename.zip 

有人可以帮我创build一个重写规则来做到这一点?

关键是一个固定的string。 它将在.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 

您访问/key/filename.zip时,您现有的代码应该已经提供/filename.zip (尽pipe应该整理一下)。

要阻止对/filename.zip直接请求,可以在现有指令之前执行以下操作:

 RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^/?\w+\.zip$ - [F] 

这会阻止(403 Forbidden) 所有/filename.zip (在文档根目录中)URL的直接请求,而不pipe它是否映射到现有文件。

或者,要发送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] 

请记住反斜杠转义点以匹配文字点。

请注意,无论是否存在/<filename>.zip ,无条件地将/<filename>.zip所有请求重写为/key/<filename>.zip 。 如果没有,你只会得到一个404。

如果您有其他指令,则可能需要L标志。

我已经修改了这些指令,所以他们将在服务器configuration(以及.htaccess )中工作。