开发者社区 > 弹性计算 > 正文

【求救】从Apache转到niginx,伪静态.htaccess中的设置变量SetEnvIf无法转换

我用的是虚拟主机,

【1】之前一直是经济版的Apache,现在要转到增强版的niginx,然后原有的.htaccess中设置了伪静态,当我用网上各种转换工具尝试将.htaccess转换成niginx配置时,发现任何工具都认不出SetEnvIf,换句话说设置变量的SetEnvIf语句无法转换,我的原始.htaccess中的部分语句 详情如下:

RewriteEngine on

SetEnvIf ^ ^ "u=https://
savef-my.sharepoint.com/personal/aappuuttii71_savef_onmicrosoft_com/_layouts/52/download.aspx?share="
SetEnvIf ^ ^ "o=http://
cloud.video.taobao.com/play/u/2024301855799/p/1/e/6/ttt/111/"

RewriteRule ^(.)YuanWu02-YinZhiWen.mp4$ %{ENV:u}EVN8AFPk4GtApOgSZxi2S8cBrGgEkWh_134pfd02HmqIbA$1
RewriteRule ^(.)yw-yinzhiwen-o.mp4$ %{ENV:o}386404163968.mp4$1

这样写的思路:由于我的这类原创视频mp4有数百个,而每条视频的链接又过于冗长,如果每个mp4都写完整链接,那么配置文件就会变得很大,延缓每次访客打开网页的速度, 于是我通过SetEnvIf先设置 u 和 o 把链接中的固定不变的前半段先定义好,那么后面具体每个作品的链接就不用再重复这冗长的一段了,而是直接用{ENV:u}和{ENV:o}接上每个不同视频的后半段链接即可,这样可以缩减配置文件的大量内容。

可是当我用网上各种转换工具尝试将.htaccess转换成niginx配置时,发现任何工具都认不出SetEnvIf,换句话说设置变量的SetEnvIf语句无法转换,求问各位大佬我该怎么办啊?

【2】另外还求问,换成niginx后,这些文件格式mp4|mp3|zip|gif|jpg|png 该怎么防盗链啊?之前我都是在.htaccess里用Rewrite弄的。

【3】还有请问,换成niginx后,有没有办法可以防止或减轻ddos攻击啊?

展开
收起
34519614 2024-02-04 21:23:58 105 0
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    【1】关于SetEnvIf无法转换的问题,你可以尝试手动将.htaccess中的伪静态规则转换为Nginx配置。以下是一个示例:

    location ~ ^(.)YuanWu02-YinZhiWen.mp4$ {
        return 302 $uEVN8AFPk4GtApOgSZxi2S8cBrGgEkWh_134pfd02HmqIbA$1;
    }
    
    location ~ ^(.)yw-yinzhiwen-o.mp4$ {
        return 302 $o386404163968.mp4$1;
    }
    

    将上述代码添加到你的Nginx配置文件中,并替换$u$o为实际的链接。

    【2】关于防盗链,你可以在Nginx配置文件中使用valid_referers指令来实现。例如:

    location ~* \.(mp4|mp3|zip|gif|jpg|png)$ {
        valid_referers none blocked yourdomain.com *.yourdomain.com;
        if ($invalid_referer) {
            return 403;
        }
    }
    

    将上述代码添加到你的Nginx配置文件中,并将yourdomain.com替换为你的实际域名。

    【3】关于防止或减轻DDoS攻击,你可以使用Nginx的limit_req模块来限制请求速率。例如:

    http {
        limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    
        server {
            location / {
                limit_req zone=mylimit burst=5;
                # 其他配置...
            }
        }
    }
    

    将上述代码添加到你的Nginx配置文件中,可以根据需要调整rateburst参数。

    2024-02-05 19:57:59
    赞同 展开评论 打赏
  • 对于你的问题,我将分别给出解答:

    【1】Nginx与Apache相比,其环境变量设置和重写规则有所不同。Apache中的SetEnvIf指令在Nginx中并没有直接对应的语法,但可以通过map指令配合$request_uri变量实现类似的功能。不过,你提供的.htaccess片段似乎是在重写规则中引用预先设置的环境变量,而不是简单的URL匹配。在Nginx中,你可以尝试使用如下方式实现:

    map $request_uri $variable_u {
        ~^YuanWu02-YinZhiWen.mp4$ "https://savef-my.sharepoint.com/personal/aappuuttii71_savef_onmicrosoft_com/_layouts/52/download.aspx?share=";
    }
    
    map $request_uri $variable_o {
        ~^yw-yinzhiwen-o.mp4$ "http://cloud.video.taobao.com/play/u/2024301855799/p/1/e/6/ttt/";
    }
    
    location ~* \.(mp4)$ {
        if ($request_uri ~ ^(.*)(YuanWu02-YinZhiWen\.mp4)$) {
            rewrite ^ $variable_u$2 break;
        }
        if ($request_uri ~ ^(.*)(yw-yinzhiwen-o\.mp4)$) {
            rewrite ^ $variable_o$2386404163968.mp4 break;
        }
    }
    

    注意,这段代码是一个示例,可能需要根据实际情况调整以满足你的需求。并且,由于Nginx对变量赋值和条件判断的处理方式与Apache不同,以上代码可能存在逻辑上的差异,请你谨慎测试并根据实际情况调整。

    【2】在Nginx中,可以使用valid_referers配合returnrewrite指令实现防盗链功能,示例如下:

    location ~* \.(mp4|mp3|zip|gif|jpg|png)$ {
        valid_referers none blocked yourdomain.com *.yourdomain.com;
        if ($invalid_referer) {
            return 403; # 或者返回一个自定义的错误页面
            # rewrite ^ /403.html break; # 返回一个403错误页面
        }
    }
    

    请将yourdomain.com替换为你的实际域名。

    【3】Nginx本身就具备一定的DDoS防护能力,可以通过限制连接数、请求速率等手段减轻DDoS攻击影响。基本配置示例如下:

    http {
        limit_conn_zone $binary_remote_addr zone=perip:10m; # 按IP限流
        limit_conn_perip 10; # 每个IP最大并发连接数
    
        limit_req_zone $binary_remote_addr zone=reqzone:10m rate=1r/s; # 请求速率限制
        limit_req_status 503; # 当超过限制时返回的状态码
    
        server {
            location / {
                limit_req zone=reqzone burst=5 nodelay; # 允许突发请求,但整体维持1r/s的速率
            }
        }
    }
    

    对于大规模的DDoS攻击,建议采用专业的DDoS防护服务或解决方案,如阿里云的DDoS防护产品。同时,合理的网络架构、负载均衡策略以及防火墙规则也是防御DDoS攻击的重要组成部分。

    2024-02-05 13:31:12
    赞同 展开评论 打赏

云服务器(Elastic Compute Service,简称 ECS)是一种简单高效、处理能力可弹性伸缩的计算服务,可快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本。

相关电子书

更多
Apache Flink技术进阶 立即下载
Apache Spark: Cloud and On-Prem 立即下载
Hybrid Cloud and Apache Spark 立即下载

相关镜像