我正在尝试转换:
要么
或者
取决于哪个更简单或更快
这对于索引页有效,但对于子文件夹和文件,它会陷入重定向循环。
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
看起来您当前的配置也是这样。添加一些您想要的示例,我可能会更新此配置以使其更相关)。