我正在使用以下服务块通过 NGINX 安全链接提供一些 mp4 文件。
server {
listen 80;
listen [::]:80;
root /var/www/cdn;
index index.html index.php index.htm index.nginx-debian.html;
server_name cdn.server.xyz;
location /v {
root /var/www/cdn/videos;
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr supersecret";
if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; }
}
}
使用以下 PHP 代码来生成哈希值:
<?php
$expires = time()+7200; # e.g. 2 hours url expiry would be time()+7200;
$domain = 'http://cdn.server.xyz';
$uri = urldecode('/v/test.mp4'); #uri
$ip = 'XXX.XXX.XXX.XXX';
$secure_text = 'supersecret';
function getSecureHash($ip, $uri, $secure_text, $expires){
$str = $expires.$uri.$ip.' '.$secure_text;
$tmp = md5( $str, true );
$tmp1 = base64_encode( $tmp );
return str_replace( array('+', '/', '='), array('-', '_', ''), $tmp1 );
}
$url = "$domain$uri?md5=".getSecureHash($ip, $uri, $secure_text, $expires)."&expires=$expires";
echo $url;
我遇到的问题是,对于任何请求,我都会遇到 403 错误。
这是 nginx error.log(https://pastebin.com/UkfQWttC)有什么建议表明我做错了什么吗?
答案1
nginx 安全链接文档规定 MD5 哈希值应使用以下方式进行编码base64url。
但是,在您的代码中,您使用的是普通的 Base64 编码,这是不同的。您可以使用中描述的函数Base64大师在 PHP 中执行 base64url 编码。
base64 和 base64 编码的区别在于+
被 替换为-
,/
被 替换为_
。