2017-04-06 72 views
0

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

现在出于技术原因(Drupal的域模块的使用是确切的)我想用一个子域来放置网站。可以说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; 
} 
} 

我已经离开了某些位置的条目,我觉得上面有相关的唯一因素,特别是第一个。但是,由于/ jp url不是一个页面,所以在example.com网站的一个404上产生了结果。

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

回答

0

我想我找到了解决办法:

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

我添加了另一个虚拟主机在一个单独的conf文件侦听端口81。虽然这似乎到网页的工作,所有的文件页面内(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,所以我必须对URL进行硬编码。如果您使用多个sub_filter声明,它们不会彼此工作。因此,如果您将src =“/ test”替换为src =“http://jp.example.com/test”,然后替换为“www.example.com/jp”的“jp.example.com”,则不会被取代。这意味着我需要用硬编码的域来做这个技巧,但至少它可以工作。我不确定这是否会对nginx性能产生影响。