我正在不同国家/地区的网站上工作。出于搜索引擎优化的原因,我们希望将每个国家/地区的子目录用于网址。所以我们将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时,它确实有效。可以这样做,如果是,怎么做?
答案 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性能是否有任何影响。