![在 nginx 上为移动子域名的 request_uri 附加一个参数](https://linux22.com/image/676033/%E5%9C%A8%20nginx%20%E4%B8%8A%E4%B8%BA%E7%A7%BB%E5%8A%A8%E5%AD%90%E5%9F%9F%E5%90%8D%E7%9A%84%20request_uri%20%E9%99%84%E5%8A%A0%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0.png)
我正在运行一个多语言 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 /
块的内部,也可以放置在其上方。