Nginx使用子域作为查询参数并重写URL

时间:2018-09-01 17:16:58

标签: nginx subdomain

我正在尝试使用子域作为域本身的查询参数。 一个示例如下:

我希望nginx使用 ab.example.com 并调用 example.com?key=ab ,现在后端将返回一个特定的配置,应使用子域“ 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;
}

有人看到我在做错什么,还是应该再次阅读文档的哪一部分?

1 个答案:

答案 0 :(得分:0)

您只需要在自己的server_name指令中执行此操作。您可以直接在正则表达式中分配变量。如果您需要对www.子域采取不同的行为,只需从块中删除*.example.com并将其添加到另一个文件中即可:

server {
    listen       80;
    server_name  ~^(?<subdomain>.+)\.example\.com$; 
    return       301 http://example.com$request_uri?key=$subdomain;
}

请注意,我没有使用rewrite,您不需要使用它。使用return performs better301代表重定向。然后,使用您分配的server_name变量将其重定向到所需的位置。