NGINX secure_link 返回 403

NGINX secure_link 返回 403

我正在使用以下服务块通过 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 编码的区别在于+被 替换为-/被 替换为_

相关内容