NGINX代理网址到不同的子域

时间:2017-04-06 16:41:31

标签: nginx reverse-proxy

我正在不同国家/地区的网站上工作。出于搜索引擎优化的原因,我们希望将每个国家/地区的子目录用于网址。所以我们将example.com作为主域。当您导航到example.com/jp/时,您将看到日文版。

现在由于技术原因(准确地使用Drupal的Domains模块)我想使用子域来放置网站。让我们说jp.example.com。对外界来说,人们会导航到/ jp /但是NGINX会返回jp.example.com

jp.example.com和example.com都是同一个网站,但由于域模块,它显示不同的内容。这意味着他们共享他们的代码库,理论上他们的虚拟主机配置。我一直在尝试很多东西,但结果却是这样:

server {
listen       80;
server_name  www.example.com jp.example.com;
root /var/www/example.com;
index index.php index.html index.htm;    

location /jp(.+)$ {
    proxy_pass http://jp.example.com$1;
}

location @rewrite {
    rewrite ^/(.*)$ /index.php?q=$1;
}

location ~ '\.php$|^/update.php' {
    fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
    include fastcgi_params;
    fastcgi_param HTTP_PROXY "";
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}

我遗漏了一些位置条目,我认为以上是唯一相关的,特别是第一个。然而,这会在example.com网站上的404中产生,因为/ jp url不是页面。

当我直接访问jp.example.com时,它确实有效。可以这样做,如果是,怎么做?

1 个答案:

答案 0 :(得分:0)

我想我找到了解决方案:

location ~* ^/jp/ {
    rewrite ^/jp/(.*)$ /$1 break;
    proxy_pass http://jp.example.com:81/$1;
}

我在另一个侦听端口81的conf文件中添加了另一个vhost。虽然这似乎适用于页面,但页面中的所有文件(css,图像等)仍然直接从example.com加载。所以我认为域模块仍然将其视为主要网站。 nginx会以某种方式转发原始主机名吗?

更新:我通过使用sub_filter模块在输出HTML中重写URL来最终得到一些讨厌的nginx技巧。它看起来像这样:

location ~ '\.php$|^/update.php' {
        sub_filter 'href="/' 'href="http://www.example.com/jp/$1';
        sub_filter 'src="/' 'src="http://www.example.com/jp/$1';
        sub_filter 'jp.example.com' 'www.example.com/jp';
        sub_filter_once off;
        sub_filter_types *;

        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

我必须对网址进行硬编码,因为$ host指向jp.example.com。如果使用多个sub_filter声明,则它们不会相互协作。所以如果你替换src =" / test"用src =" http://jp.example.com/test"然后替换" jp.example.com" for" www.example.com/jp"它没有被替换。对于我需要使用硬编码域执行此操作的每种语言都意味着,但至少它是有效的。我不确定这对nginx性能是否有任何影响。