Nginx与Apache环境防盗链设置方法

本文介绍如何在Nginx和Apache环境下为VPS设置防盗链,保护网站流量,避免媒体文件被非法引用,消耗过多带宽。通过简单配置,可有效阻止非授权访问。

说明:很多人的VPS流量是有限的,而一般情况下我们放在网站上的媒体文件都是可以被别人引用的,我们的文件也就成了别人的免费外链,可想而知流量会消耗的有多快,这时候设置一下防盗链还是很有必要的。

根据我们搭建的系统环境不同,我们在NginxApache中设置防盗链的方法也是不同的。

Nginx防盗链方法

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|mp3|wav|zip|rar)$ {
    valid_referers none blocked xirik.cn *.xirik.cn;
    if ($invalid_referer){
        return 403;
    }
    expires 30d;
}

在网站所在的配置文件*.conf中添加以上代码,添加后重启nginx就可以生效,网址记得替换成自己的。

Apache防盗链方法

首先我们需要保证开启了Apache的伪静态模块

然后把下面代码中的网址替换成自己的,复制到网站根目录下的伪静态文件.htaccess中即可生效。

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://xirik.cn/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://xirik.cn$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.xirik.cn/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.xirik.cn$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|png|bmp|swf|mp3|wav|zip|rar)$ http://xirik.cn/404.html [R,NC]
### Nginx - **限速**:全局限速可在`http`块中设置`limit_rate`,若要对特定虚拟主机或目录设置不同限速,可在相应的`server`或`location`块中设置`limit_rate`。也可在`location`块中对每个连接进行限速。 ```nginx http { limit_rate 100k; server { server_name www.b.com; limit_rate 200k; location /file_a { limit_rate 300k; } location /file_b { limit_rate 0; } } } ``` ```nginx location ~ [^/]\.php(/|$) { limit_rate 300k; } ``` - **限流**:可从请求频率和并发连接数两个方面进行控制。请求频率限制使用`limit_req_zone`和`limit_req`指令;并发连接数限制使用`limit_conn_zone`和`limit_conn`指令。 ```nginx http { limit_req_zone $binary_remote_addr zone=yhx_req_zone:10m rate=10r/s; server { location / { limit_req zone=yhx_req_zone; } } } ``` ```nginx http { limit_conn_zone $binary_remote_addr zone=yhx_conn_zone:10m; limit_conn_zone $server_name zone=yhx_perserver_zone:10m; server { location / { limit_conn yhx_conn_zone 1; limit_conn yhx_perserver_zone 1000; } } } ``` - **设置防盗链**:使用`valid_referers`和`$invalid_referer`变量来只允许指定来源访问资源。 ```nginx location /images/ { valid_referers none blocked yourdomain.com *.yourdomain.com; if ($invalid_referer) { return 403; } } ``` ### Tomcat - **限速**:可通过修改`server.xml`文件,在`Connector`标签中添加`maxSwallowSize`和`maxHttpHeaderSize`等属性来限制请求体和请求头的大小,间接实现一定程度的限速。 ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxSwallowSize="1048576" maxHttpHeaderSize="8192"/> ``` - **限流**:可以使用`Valve`组件来实现。例如自定义一个`Valve`类,在其中实现限流逻辑。以下是一个简单示例: ```java import org.apache.catalina.Valve; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; import javax.servlet.ServletException; import java.io.IOException; public class RateLimitValve extends ValveBase { private int maxRequests = 100; private int currentRequests = 0; @Override public void invoke(Request request, Response response) throws IOException, ServletException { if (currentRequests < maxRequests) { currentRequests++; try { getNext().invoke(request, response); } finally { currentRequests--; } } else { response.sendError(503, "Service Unavailable"); } } } ``` 然后在`server.xml`中添加该`Valve`: ```xml <Valve className="com.example.RateLimitValve"/> ``` - **设置防盗链**:可以通过编写`Filter`来实现。以下是一个简单示例: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RefererFilter implements Filter { private String allowedReferer = "yourdomain.com"; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String referer = httpRequest.getHeader("Referer"); if (referer == null ||!referer.contains(allowedReferer)) { httpResponse.sendError(403, "Forbidden"); return; } chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void destroy() { // 销毁操作 } } ``` 然后在`web.xml`中配置该`Filter`: ```xml <filter> <filter-name>RefererFilter</filter-name> <filter-class>com.example.RefererFilter</filter-class> </filter> <filter-mapping> <filter-name>RefererFilter</filter-name> <url-pattern>/images/*</url-pattern> </filter-mapping> ``` ### Apache - **限速**:可以使用`mod_bandwidth`模块来实现限速。首先需要确保该模块已安装并启用,然后在配置文件中添加如下配置: ```apache <IfModule mod_bandwidth.c> BandwidthModule On ForceBandwidthModule On Bandwidth all 102400 # 限制所有连接的带宽为100KB/s </IfModule> ``` - **限流**:可以使用`mod_qos`模块来实现。确保该模块已安装并启用,然后在配置文件中添加如下配置: ```apache <IfModule mod_qos.c> # 限制每个IP的并发连接数 QS_SrvMaxConnPerIP 10 # 限制每秒的请求数 QS_BurstLimit 100 </IfModule> ``` - **设置防盗链**:使用`mod_rewrite`模块来实现。在配置文件中添加如下配置: ```apache <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_REFERER}!^$ RewriteCond %{HTTP_REFERER}!^http(s)?://(www\.)?yourdomain.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ - [F] </IfModule> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值