将参数附加到nginx上的移动子域的request_uri

我在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, 短url和从http://https://redirect。

这是我的服务器块的样子:

 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; 在语义上是不正确的。

简单的解决scheme是通过执行外部redirect来修改$request_uri 。 这很麻烦,因为你只需要识别那些没有mobileaction参数的URI。 例如:

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

rewrite指令照顾? vs &和自动附加现有的参数列表。

if块可以放置在location /块之内或之上。