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

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

我们有一位客户的网站在 Apache 上运行。最近,该网站的负载不断增加,为了解决问题,我们想将网站上的所有静态内容转移到无 cookie 的域,例如http://static.thedomain.com

应用程序不太好理解。因此,为了让开发人员有时间修改代码,将他们的链接指向静态内容服务器(http://static.thedomain.com),我考虑通过 nginx 代理网站,并重写传出的响应,这样指向的链接就会/images/...被重写为http://static.thedomain.com/images/...

例如,在 Apache 向 nginx 发出的响应中,有一个 Headers + HTML 块。在 Apache 返回的 HTML 中,我们有<img>如下标签:

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

我想将其转换为:

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

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

使用 nginx (或 HAProxy) 可以实现这个吗?

我粗略地浏览了一下文档,除了重写入站 URL 之外,没有什么特别之处。

答案1

有一个http://wiki.nginx.org/HttpSubModule- “该模块可以搜索和替换 nginx 响应中的文本。”

从文档中复制过去:

句法:

sub_filter string replacement

例子:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}

答案2

最好使用代理功能并从适当的位置获取内容,而不是重写 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;
        }
}

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

我希望这能有所帮助

相关内容