NGINX 代理 URL 到不同的子域
NGINX proxy URL to different subdomain
我正在开发一个以不同 countries/regions 提供的网站。出于 SEO 的原因,我们希望为 url 使用每个国家/地区的子目录。所以我们有 example.com 作为主域。当您导航至 example.com/jp/ 时,您将看到日语版本。
现在由于技术原因(确切地说是 Drupal 域模块的使用)我想使用子域来放置网站。让我们说 jp.example.com。对于外界,人们会导航到 /jp/ 但 NGINX returns 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;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?q=;
}
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 时,它确实有效。可以做到吗?如果可以,怎么做?
我想我找到了解决方案:
location ~* ^/jp/ {
rewrite ^/jp/(.*)$ / break;
proxy_pass http://jp.example.com:81/;
}
我在一个单独的 conf 文件中添加了另一个虚拟主机来侦听端口 81。虽然这似乎对页面有效,但页面中的所有文件(css、图像等)仍在从 example.com 直接。所以我认为域模块仍然将其视为主要网站。 nginx 是否以某种方式转发原始主机名?
Update:我通过使用 sub_filter 模块重写输出 HTML 中的 URL 而结束了一些讨厌的 nginx 技巧.它看起来像这样:
location ~ '\.php$|^/update.php' {
sub_filter 'href="/' 'href="http://www.example.com/jp/';
sub_filter 'src="/' 'src="http://www.example.com/jp/';
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;
}
我不得不对 URL 进行硬编码,因为 $host 指向 jp.example.com。如果您使用多个 sub_filter 声明,它们不会相互影响。因此,如果您将 src="/test" 替换为 src="http://jp.example.com/test",然后将 "jp.example.com" 替换为 "www.example.com/jp",它不会被替换。这意味着对于每种语言,我都需要对硬编码域执行此技巧,但至少它有效。我不确定这是否对 nginx 性能有任何影响。
我正在开发一个以不同 countries/regions 提供的网站。出于 SEO 的原因,我们希望为 url 使用每个国家/地区的子目录。所以我们有 example.com 作为主域。当您导航至 example.com/jp/ 时,您将看到日语版本。
现在由于技术原因(确切地说是 Drupal 域模块的使用)我想使用子域来放置网站。让我们说 jp.example.com。对于外界,人们会导航到 /jp/ 但 NGINX returns 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;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?q=;
}
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 时,它确实有效。可以做到吗?如果可以,怎么做?
我想我找到了解决方案:
location ~* ^/jp/ {
rewrite ^/jp/(.*)$ / break;
proxy_pass http://jp.example.com:81/;
}
我在一个单独的 conf 文件中添加了另一个虚拟主机来侦听端口 81。虽然这似乎对页面有效,但页面中的所有文件(css、图像等)仍在从 example.com 直接。所以我认为域模块仍然将其视为主要网站。 nginx 是否以某种方式转发原始主机名?
Update:我通过使用 sub_filter 模块重写输出 HTML 中的 URL 而结束了一些讨厌的 nginx 技巧.它看起来像这样:
location ~ '\.php$|^/update.php' {
sub_filter 'href="/' 'href="http://www.example.com/jp/';
sub_filter 'src="/' 'src="http://www.example.com/jp/';
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;
}
我不得不对 URL 进行硬编码,因为 $host 指向 jp.example.com。如果您使用多个 sub_filter 声明,它们不会相互影响。因此,如果您将 src="/test" 替换为 src="http://jp.example.com/test",然后将 "jp.example.com" 替换为 "www.example.com/jp",它不会被替换。这意味着对于每种语言,我都需要对硬编码域执行此技巧,但至少它有效。我不确定这是否对 nginx 性能有任何影响。