Nginx 使用子域作为查询参数并重写 URL
Nginx use subdomain as query parameter and rewrite URL
我正在尝试使用子域作为域本身的查询参数。
示例如下:
我想让nginx接受ab.example.com并调用example.com?key=ab,现在是后端将 return 一个特定的配置,应该用于子域“ab”。
之后用户应该看到 example.com?key=ab 的内容(准确地说是徽标品牌),但在客户端的 URL 字段中ab.example.com 应该坚持。
并且所有进一步的请求都应该显示例如 ab.example.com/login 而不是 example.com/login.
我希望我所说的足够容易理解。我尝试了互联网上的各种示例并试图找到一些提示。
nginx 文件如下所示:
server {
listen 80;
listen [::]:80;
server_name www.example.com *.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com *.example.com;
ssl_certificate /path/to/certs/ssl.crt;
ssl_certificate_key /path/to/keys/ssl.key;
root /var/www/example_site;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ /index.html =404;
error_page 404 =200;
}
}
我已经尝试映射,但它重定向到错误的域:
map $host $subdomain {
~^(?<sub>.+)\.example\.com$ $sub;
}
并尝试在服务器块中添加静态 if 语句:
if ($host = "ab.example.com") {
rewrite . ?key=ab;
}
额外的服务器块也没有帮助:
server {
listen 80;
listen [::]:80;
server_name www.ab.example.come ab.example.com;
rewrite ^ https://example.com/?key=ab permanent;
}
有人看到我做错了什么或者我应该再次阅读文档的哪一部分吗?
您只需要在自己的 server_name
指令中执行即可。您可以直接在正则表达式中分配一个变量。如果您需要 www.
子域的不同行为,只需从块中删除 *.example.com
并将其添加到另一个文件中:
server {
listen 80;
server_name ~^(?<subdomain>.+)\.example\.com$;
return 301 http://example.com$request_uri?key=$subdomain;
}
请注意,我没有使用您不需要的 rewrite
。使用 return
。 301
代表重定向的种类。然后,您使用 server_name
分配的变量重定向到您需要的地方。
我正在尝试使用子域作为域本身的查询参数。 示例如下:
我想让nginx接受ab.example.com并调用example.com?key=ab,现在是后端将 return 一个特定的配置,应该用于子域“ab”。
之后用户应该看到 example.com?key=ab 的内容(准确地说是徽标品牌),但在客户端的 URL 字段中ab.example.com 应该坚持。
并且所有进一步的请求都应该显示例如 ab.example.com/login 而不是 example.com/login.
我希望我所说的足够容易理解。我尝试了互联网上的各种示例并试图找到一些提示。
nginx 文件如下所示:
server {
listen 80;
listen [::]:80;
server_name www.example.com *.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com *.example.com;
ssl_certificate /path/to/certs/ssl.crt;
ssl_certificate_key /path/to/keys/ssl.key;
root /var/www/example_site;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ /index.html =404;
error_page 404 =200;
}
}
我已经尝试映射,但它重定向到错误的域:
map $host $subdomain {
~^(?<sub>.+)\.example\.com$ $sub;
}
并尝试在服务器块中添加静态 if 语句:
if ($host = "ab.example.com") {
rewrite . ?key=ab;
}
额外的服务器块也没有帮助:
server {
listen 80;
listen [::]:80;
server_name www.ab.example.come ab.example.com;
rewrite ^ https://example.com/?key=ab permanent;
}
有人看到我做错了什么或者我应该再次阅读文档的哪一部分吗?
您只需要在自己的 server_name
指令中执行即可。您可以直接在正则表达式中分配一个变量。如果您需要 www.
子域的不同行为,只需从块中删除 *.example.com
并将其添加到另一个文件中:
server {
listen 80;
server_name ~^(?<subdomain>.+)\.example\.com$;
return 301 http://example.com$request_uri?key=$subdomain;
}
请注意,我没有使用您不需要的 rewrite
。使用 return
301
代表重定向的种类。然后,您使用 server_name
分配的变量重定向到您需要的地方。