在 nginx 上为移动子域名的 request_uri 附加一个参数

在 nginx 上为移动子域名的 request_uri 附加一个参数

我正在运行一个多语言 wiki(MediaWiki 1.26.2移动前端) 在 nginx 1.9.3/OpenBSD 5.8 上。

对于每种语言 wiki,我都有一个单独的 MediaWiki 安装文件夹和一个指向该文件夹的子域名,如 en.domain.com。

我想使用桌面视图的 MediaWiki 安装文件夹为移动视图添加一个子域名,例如 en.m.domain.com,但附加一个&mobileaction=toggle_view_mobile(或者?mobileaction=toggle_view_mobile如果已经有一个参数,则用问号而不是与号)。

我也在使用 CORS,短网址并从 重定向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部件不起作用:(

任何想法如何解决这一问题?

谢谢,欢呼!

直到

答案1

您当前的实现存在多个问题:您有两个location /块并且rewrite $new_request_uri last;语义不正确。

简单的解决方案是$request_uri通过执行外部重定向。这很麻烦,因为您只需要识别那些没有参数的 URI mobileaction。例如:

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

rewrite指令负责?vs&并自动附加现有的参数列表。

if块可以放置在location /块的内部,也可以放置在其上方。

相关内容