Acrescentar um argumento ao request_uri para o subdomínio móvel no nginx

1

Estou executando um wiki multilíngüe (MediaWiki 1.26.2 com MobileFrontend ) no nginx 1.9.3 / OpenBSD 5.8.

Para cada wiki de idioma, eu tenho uma pasta de instalação separada do MediaWiki e um subdomínio como en.domain.com apontando para essa pasta.

Gostaria de adicionar um subdomínio como en.m.domain.com para a visualização móvel usando a pasta de instalação do MediaWiki da visualização da área de trabalho, mas com um &mobileaction=toggle_view_mobile (ou ?mobileaction=toggle_view_mobile com um ponto de interrogação em vez de um e comercial, se já houver um argumento).

Também estou usando CORS, URLs curtos e redirecionados de http:// para https:// .

É assim que meu bloco de servidores se parece:

server {
    listen 80;
    server_name en.m.domain.com;
    root /path/to/domain/en;
    index index.html index.htm index.php;
    autoindex off;

# CORS
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'X-Requested-With, Accept, Content-Type, Origin';

# Redirect to https://

    if ($http_cf_visitor ~ '{"scheme":"http"}') {
        return 301 https://$server_name$request_uri;
        }

    location = / {
        return 301 https://en.m.domain.com/wiki/Main_Page;
        }

    location = /w {
        return 301 https://en.m.domain.com/wiki/Main_Page;
        }

    location = /w/ {
        return 301 https://en.m.domain.com/wiki/Main_Page;
        }

    location = /wiki {
        return 301 https://en.m.domain.com/wiki/Main_Page;
        }

    location = /wiki/ {
        return 301 https://en.m.domain.com/wiki/Main_Page;
        }

# Short URLs

    location / {
        index index.php;
        error_page 404 = @mediawiki;
        }

    location @mediawiki {
        rewrite ^/wiki([^?]*)(?:\?(.*))? /w/index.php?title=$1&$2 last;
        }

    location ~ \.php5?$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass   127.0.0.1:1234;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        }

    location ~ \.php?$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass   127.0.0.1:1234;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        }

# Append mobileaction=toggle_view_mobile for mobile version

    location / {                                                   

        # If there are no arguments add a question mark
        if ($args = '') {                                            
        set $new_request_uri "$request_uri?mobileaction=toggle_view_mobile";  
        }                                                            

        # If there are already arguments add an ampersand
        if ($args != "") {      
        set $new_request_uri "$request_uri&mobileaction=toggle_view_mobile";  
        }

        rewrite $new_request_uri last;        
        }       

}

Infelizmente, a parte mobileaction=toggle_view_mobile não funciona: (

Alguma idéia de como corrigir isso?

Obrigado e felicidades,

Até

    
por Till Kraemer 31.01.2016 / 18:11

1 resposta

0

Existem vários problemas com sua implementação atual: você tem dois location / blocks e rewrite $new_request_uri last; é semanticamente incorreto.

A solução fácil é modificar o $request_uri executando um redirecionamento externo . Isso é confuso porque você precisa identificar apenas os URIs que não possuem um argumento mobileaction . Por exemplo:

if ($args !~* mobileaction) {
    rewrite ^ $uri?mobileaction=toggle_view_mobile permanent;
}

A diretiva rewrite cuida de ? vs & e anexa automaticamente a lista de argumentos existente.

O bloco if pode ser colocado dentro do bloco location / ou acima dele.

    
por 01.02.2016 / 13:19