Nginx:通配符子域名将 URL 重定向到带有请求的页面

Nginx:通配符子域名将 URL 重定向到带有请求的页面

我正在尝试转换:

http://test.example.com/file.php

要么

http://www.example.com/file.php?subdomain=test

或者

http://test.example.com/file.php?subdomain=test

取决于哪个更简单或更快

这对于索引页有效,但对于子文件夹和文件,它会陷入重定向循环。

server {
      listen   80;

      # Make site accessible from http://localhost/
      server_name   ~^[^.]+.example.com$;
      rewrite ^/(.*)/$ /$1 permanent;

      if ($host ~* ^([^.]+).example.com$) {
              set $subdomain $1;
      }
      rewrite ^(.*)$ $1?subdomain=$subdomain last;

      location / {
              root /var/www/example.com;
              index index.html index.php;
      }

      location ~ \.php$ {
              try_files $uri =404;
              root            /var/www/example.com;
              fastcgi_pass    unix:/var/run/php-fpm.sock;
              fastcgi_index   index.php;
              fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script
              include         fastcgi_params;
     }
}

答案1

我不太确定你的目标是什么 - 因为您的示例显示了两种可能性。以下配置(未经测试)应导致:

http://test.example.com/file.php ==> http://www.example.com/file.php?subdomain=test

它应该匹配任何子域名和任何文件名。

server{
    server_name www.example.com;
    root /var/www/example.com;
    index index.html index.php;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass    unix:/var/run/php-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script
        include         fastcgi_params;
    }
}
server {
    server_name  "~^(?<subdomain>.+)\.example\.com$";
    rewrite ^/(.*?)/?$ http://www.example.com/$1?subdomain=$subdomain;
}

简要说明:

  • 静态服务器名称在正则表达式之前匹配 - 因此,对 www.example.com 的任何请求都将由第一个服务器块处理
  • 如果可能的话,root 和 index 指令应该放在 server 块(而不是 location 块)下
  • 端口 80 不需要 listen 指令
  • 第二个服务器块使用命名捕获将子域分配给变量
  • 重写捕获从第一个斜杠到最后一个斜杠的所有内容,但排除两者((.*?) 是懒惰的)。

(顺便说一句,我真的不太清楚你的配置应该如何处理目录或静态文件这样的情况。目前,应该发生以下情况(这似乎不太合理):

http://test.example.com/file.jpg ==> http://www.example.com/file.jpg?subdomain=test
http://test.example.com/path/to/subfolder/ ==> http://www.example.com/path/to/subfolder?subdomain=test

看起来您当前的配置也是这样。添加一些您想要的示例,我可能会更新此配置以使其更相关)。

相关内容