Nginx: URL de redirecionamento do subdomínio de cartão curinga para a página com solicitação

2

Estou tentando converter:

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

Para

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

ou

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

Dependendo do que é mais simples de fazer ou mais rápido

Isso funciona para a página de índice, mas para subpastas e arquivos que ela recebe em um loop de redirecionamento.

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;
     }
}
    
por jpiasetz 20.03.2012 / 18:31

1 resposta

1

Não sei bem qual é o seu objetivo, pois o seu exemplo mostra duas possibilidades. A configuração abaixo (não testada) deve resultar em:

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

Ele deve corresponder a qualquer subdomínio e qualquer nome de arquivo.

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;
}

Breves explicações:

  • server_names estáticos são correspondidos antes dos regexes - assim, qualquer solicitação para www.example.com será tratada pelo primeiro bloco de servidor
  • As diretivas raiz e índice
  • devem ser colocadas sob o bloco do servidor (não o bloco de localização), se possível
  • a diretiva de escuta não é necessária para a porta 80
  • o segundo bloco de servidor usa uma captura nomeada para atribuir o subdomínio a uma variável
  • a reescrita captura tudo, desde a primeira barra até a última, excluindo ambas (a (. *?) é preguiçosa).

(Como um aparte, eu realmente não tenho certeza do que sua configuração deve fazer com casos como um diretório ou um arquivo estático. Atualmente, o seguinte deve ocorrer (o que não parece sensato):

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

Parece que sua configuração atual faz o mesmo. Adicione mais alguns exemplos do que você quer e posso atualizar essa configuração para ser mais relevante).

    
por 20.03.2012 / 19:17

Tags