我在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 /块之内或之上。