Nginx

在 nginx 上為移動子域的 request_uri 添加一個參數

  • February 1, 2016

我在 nginx 1.9.3/OpenBSD 5.8 上執行多語言 wiki(MediaWiki 1.26.2 和MobileFrontend )。

對於每個語言 wiki,我都有一個單獨的 MediaWiki 安裝文件夾和一個指向該文件夾的子域(如 en.domain.com)。

我想使用桌面視圖的 MediaWiki 安裝文件夾為移動視圖添加像 en.m.domain.com 這樣的子域,但附加一個&mobileaction=toggle_view_mobile(或者?mobileaction=toggle_view_mobile如果已經有參數,則使用問號而不是 & 號) .

我還使用 CORS、短 URLhttp://和從to重定向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通過執行外部重定向來修改。這很麻煩,因為您只需要辨識那些沒有mobileaction參數的 URI。例如:

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

rewrite指令負責?vs&並自動附加現有的參數列表。

if塊可以放置在塊內部location /或上方。

引用自:https://serverfault.com/questions/753033