Nginx Reescreva a subpasta para um subdomínio e mantenha tudo depois disso

2

Estou tentando reescrever o URL para lidar com o cenário a seguir, desejo redirecionar algumas subpastas específicas para alguns subdomínios específicos e manter o que quer que esteja depois da subpasta.

Até agora eu tenho:

location / {
    rewrite ^/sub1/?(.*)$ https://sub1.example.com/$1 permanent;
    rewrite ^/sub2/?(.*)$ https://sub2.example.com/$1 permanent;
    rewrite ^/sub3/?(.*)$ https://sub3.example.com/$1 permanent;
    rewrite ^/sub4/?(.*)$ https://sub4.example.com/$1 permanent;
}

Isso lida com example.com/sub1 example.com/sub1/ example.com/sub1/foobar
Mas não é example.com/sub1/page.php que vai para example.com/sub1/page.php e 404 porque não existe.

Eu quero que example.com/sub1 vá para sub1.example.com e example.com/sub1/ para acessar sub1.example.com/ e example.com/sub1/foobar para ir para sub1.example.com/foobar e example.com/sub1/foo/bar/ para ir para sub1.example.com/foo/bar/ e example.com/sub1/page.php para ir para sub1.example.com/page.php

O que estou perdendo aqui? Minha regex está enferrujada?

EDIT: Aqui está toda a minha configuração para o site, no caso de ser um problema com outra coisa substituindo-o. link

    
por Greyhammer 10.11.2017 / 16:07

1 resposta

1

Em um dos blocos server , você tem um bloco location ~ \.php ao lado do bloco location que contém o rewrite statements. That regular expression location block takes precedence when evaluating URIs which end with .php '.

Uma opção é mover as instruções reescritas para o bloco server , caso em que elas serão executadas antes de qualquer bloco location escolhido. Por exemplo:

server {
    ...

    rewrite ^/sub1/?(.*)$ https://sub1.example.com/$1 permanent;
    rewrite ^/sub2/?(.*)$ https://sub2.example.com/$1 permanent;
    rewrite ^/sub3/?(.*)$ https://sub3.example.com/$1 permanent;
    rewrite ^/sub4/?(.*)$ https://sub4.example.com/$1 permanent;

    location / {
    }

    location ~ \.php$ 
    { 
        ... 
    }
    ...
}

Como alternativa, uma solução mais eficiente seria colocar as instruções de reescrita dentro de locais de prefixo individuais, mas use o modificador ^~ para dar a eles uma precedência mais alta. Consulte este documento para obter detalhes.

location ^~ /sub1 {
    rewrite ^/sub1/?(.*)$ https://sub1.example.com/$1 permanent;
}
location ^~ /sub2 {
    rewrite ^/sub2/?(.*)$ https://sub2.example.com/$1 permanent;
}
location ^~ /sub3 {
    rewrite ^/sub3/?(.*)$ https://sub3.example.com/$1 permanent;
}
location ^~ /sub4 {
    rewrite ^/sub4/?(.*)$ https://sub4.example.com/$1 permanent;
}
    
por 10.11.2017 / 17:25