Назад | Перейти на главную страницу

Добавление аргумента в request_uri для мобильного поддомена на nginx

Я использую многоязычную вики (MediaWiki 1.26.2 с MobileFrontend) на nginx 1.9.3 / OpenBSD 5.8.

Для каждой языковой вики у меня есть отдельная папка установки MediaWiki и субдомен, например en.domain.com, указывающий на эту папку.

Я хотел бы добавить субдомен, например en.m.domain.com, для мобильного представления, используя установочную папку MediaWiki рабочего стола, но с добавленным &mobileaction=toggle_view_mobile (или ?mobileaction=toggle_view_mobile со знаком вопроса вместо амперсанда, если аргумент уже существует).

Я также использую CORS, короткие URL и перенаправляет с http:// к https://.

Вот так выглядит мой серверный блок:

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

}

К сожалению, mobileaction=toggle_view_mobile часть не работает :(

Любые идеи, как это исправить?

Спасибо и ура,

Пока

В вашей текущей реализации есть несколько проблем: у вас есть два location / блоки и rewrite $new_request_uri last; семантически неверно.

Простое решение - изменить $request_uri путем выполнения внешнее перенаправление. Это беспорядочно, потому что вам нужно идентифицировать только те URI, которые не имеют mobileaction аргумент. Например:

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

В rewrite директива заботится о ? против & и автоматически добавляет существующий список аргументов.

В if блок можно разместить внутри location / блок или над ним.