使用Nginx重写传出响应中的URL


8

我们有一个客户,其网站在Apache上运行。最近,该站点的负载不断增加,并且我们希望将站点上的所有静态内容转移到无cookie域,这是一个停顿点http://static.thedomain.com

该应用程序不是很好理解。因此,为了给开发人员时间修改代码以将其链接指向静态内容服务器(http://static.thedomain.com),我考虑过通过nginx代理站点并重写传出的响应,以便将链接/images/...重写为http://static.thedomain.com/images/...

因此,例如,在Apache对nginx的响应中,出现了标题+ HTML的斑点。在从Apache返回的HTML中,我们有如下<img>标签:

<img src="/images/someimage.png" />

我想将其转换为:

<img src="http://static.thedomain.com/images/someimage.png" />

这样浏览器在接收到HTML页面后便直接从静态内容服务器请求图像。

nginx(或HAProxy)可以做到吗?

我粗略浏览了一下文档,但是除了重写入站URL之外,没有其他事情对我有所帮助。

Answers:



3

与重写URL并将重定向发送回浏览器相反,最好使用代理功能并从适当的位置获取内容。

代理内容的一个很好的例子如下:

#
#  This configuration file handles our main site - it attempts to
# serve content directly when it is static, and otherwise pass to
# an instance of Apache running upon 127.0.0.1:8080.
#
server {
    listen :80;

    server_name  www.debian-administration.org debian-administration.org;
        access_log  /var/log/nginx/d-a.proxied.log;

        #
        # Serve directly:  /images/ + /css/ + /js/
        #
    location ^~ /(images|css|js) {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }

    #
    # Serve directly: *.js, *.css, *.rdf,, *.xml, *.ico, & etc
    #
    location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }


        #
        # Proxy all remaining content to Apache
        #
        location / {

            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
}

在这种配置中,static.domain.comnginx 无需将请求重定向到浏览器并发出另一个请求,而只是从相关的本地路径提供文件。如果请求是动态的,则代理将启动并从最终用户不知道的Apache服务器(本地或远程)获取响应。

希望对您有所帮助


感谢您花费时间回答此问题。我将设置一个测试平台,并查看其工作原理。这里重要的是将所有静态内容移出Apache服务器。所以我想我可以在CDN服务器上运行nginx并将其proxy_pass设置为Apache服务器,例如proxy_pass http://172.16.3.1:80?也就是说,我们将站点的公共IP地址移动到Nginx / CDN服务器。
凯夫

是的,这是正确的。而且没有问题-我现在也非常喜欢nginx。

还没有忘记您的答案:)仍然没有机会尝试。
凯夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.