Extension:MobileFrontend/Tarayıcı otomatik algılamayı yapılandırma

This page is a translated version of the page Extension:MobileFrontend/Configuring browser auto-detection and the translation is 85% complete.

Bu belge, bir site hizmetlisinin MediaWiki uzantıları için bir mobil siteyi nasıl etkinleştirebileceğini açıklar, böylece bir kullanıcı siteyi bir mobil cihazdan ziyaret ettiğinde, masaüstü görünümü yerine otomatik olarak mobil görünüme yönlendirilir.

Dahili otomatik algılama

5a1867e taahhüdü itibariyle, MobileFrontend minimum yapılandırma ile otomatik cihaz algılamayı destekler. Yapmanız gereken tek şey LocalSettings.php içinde $wgMFAutodetectMobileView = true; ayarlamaktır. Bu en kolay yöntem olsa da, neredeyse kesinlikle en az performans gösteren yöntem olacaktır. Önbelleğinizin bir mobil görünüm ile masaüstü görünümü arasındaki farkı bilmesine olanak sağlamadığından, bu çözüm ön uç önbelleğe alma ile uyumlu DEĞİLDİR.

Apache Mobil Filtresi (AMF)

MobileFrontend, 0fb2c72d taahhüdünden itibaren cihaz algılaması için Apache Mobil Filtresini (AMF) destekler. Apache web sunucusunu kullanıyor olmalısınız. AMF'nin kurulumu/yapılandırması için talimatları izleyin ve "şimdi çalışmalıdır". Bu, yerleşik otomatik algılamaya çok benzer şekilde çalışır ve özel yapılandırma olmadan ön uç önbelleğe alma ile uyumlu olmayacaktır.

Web sunucusu/proxy-önbellek cihazı algılama

Bazı ters proxy'ler (Varnish gibi) MediaWiki'ye mobil sürümünü gerekli olup olmadığını bildirebilir, böylece önbellek dostu bir otomatik algılama oluşturur.

For Varnish 4.0 or later, replace the keyword remove with unset.

Varnish kullanarak algılama: başka bir etki alanındaki mobil site

Varnish kullandığımızı ve masaüstü sürümünü göstermek için wiki.example.com ve mobil sürümü göstermek için m.wiki.example.com istediğimizi varsayalım. İşte bunu nasıl yapacağınız.

sub vcl_recv {
	remove req.http.x-subdomain; # İstekte bulunan kişinin keyfi X-Subdomain başlığı sağlamasına izin verilmemelidir
	if (req.http.host == "m.wiki.example.com") { # mobil alanı
		set req.http.host = "wiki.example.com"; # masaüstü alanı
		set req.http.x-subdomain = "m";
	}
}
sub vcl_hash {
	# Sayfaların mobil sürümünü ayrı olarak önbelleğe alın.
	#
	# NOT: x-subdomain başlığının yalnızca bir değeri olmalıdır (varsa), bu nedenle vcl_recv(), kullanıcı tarafından sağlanan X-Subdomain başlığını kaldırmalıdır.
	hash_data(req.http.x-subdomain);
}

LocalSettings.php şunları içermelidir:

$wgMFAutodetectMobileView = false;
$wgMobileUrlCallback = fn ( $domain ) => "m.$domain"; // mobil site için alan
$wgCookieDomain = ".wiki.example.com";

"%h<#>", $server ana bilgisayar adının bir kesimiyle eşleşir. Bu yüzden, $wgServer = 'en.wikipedia.org'; ise, %h0, "en" olur, %h1, "wikipedia" olur, %h2, "org" olur. Bu göz önüne alındığında, yukarıdaki $wgMobileUrlTemplate, mobil URL'nizi otomatik olarak "en.m.wikipedia.org" olarak yorumlayacaktır. Bu, özellikle WMF ve <dil kodu>.wikipedia.org şablonunu izleyen Vikipedi gibi projeler için kullanışlıdır, bu nedenle mobil alan adı her zaman <dil kodu>.m.wikipedia.org gibi görünecektir.

Bu çözümde, yerleşik otomatik algılama devre dışı bırakılmalıdır ($wgMFAutodetectMobileView = false;), böylece MediaWiki, Varnish'in kararlarını sorgulamaz.

Varnish kullanarak algılama: masaüstü/mobil site için aynı alan adı

Varnish kullandığımızı ve wiki.example.com aynı URL'lerde masaüstü/mobil sürümü göstermesini istediğimizi varsayalım ("m.wiki.example.com" gibi ek alanlar oluşturmadan). İşte bunu nasıl yapacağınız.

sub vcl_recv {
	remove req.http.x-subdomain; # İstekte bulunan kişinin keyfi X-Subdomain başlığı sağlamasına izin verilmemelidir
	if(req.http.User-Agent ~ "(?i)^(lg-|sie-|nec-|lge-|sgh-|pg-)|(mobi|240x240|240x320|320x320|alcatel|android|audiovox|bada|benq|blackberry|cdm-|compal-|docomo|ericsson|hiptop|htc[-_]|huawei|ipod|kddi-|kindle|meego|midp|mitsu|mmp\/|mot-|motor|ngm_|nintendo|opera.m|palm|panasonic|philips|phone|playstation|portalmmm|sagem-|samsung|sanyo|sec-|sendo|sharp|softbank|symbian|teleca|up.browser|webos)") {
		set req.http.x-subdomain = "m";
	}

	if(req.http.Cookie ~ "mf_useformat=") {
		# Bu, kullanıcının altbilgideki "Mobil görünümü" değiştir bağlantısını tıkladığı anlamına gelir.
		# vcl_hash() ile bunun mobil sayfa olarak önbelleğe alınması gerektiğini bildirin.
		set req.http.x-subdomain = "m";
	}
}
sub vcl_hash {
	# Sayfaların mobil sürümünü ayrı olarak önbelleğe alın.
	#
	# NOT: x-wap başlığının yalnızca bir değeri olmalıdır (varsa), bu nedenle vcl_recv(), kullanıcı tarafından sağlanan X-Subdomain başlığını kaldırmalıdır.
	hash_data(req.http.x-subdomain);
}

LocalSettings.php should contain the following:

$wgMFAutodetectMobileView = true;
$wgCookieDomain = ".wiki.example.com";
Bu çözümde, yerleşik otomatik algılama etkinleştirilmelidir (önbelleği etkilemez):
$wgMFAutodetectMobileView = true;

Aksi takdirde, MobileFrontend hatalı davranışlar sergiler ($wgMobileUrlCallback ayarlamazsak, X-Subdomain başlığını yok sayar, yaparsak, "altbilgideki bağlantıları Mobil görünümü değiştir" için "useformat" çerezleri ayarlamaz).

Detection using nginx: mobile site on another domain

Suppose we use nginx, and we want wiki.example.com to show desktop version, and m.wiki.example.com to show mobile version. Here's how to do that. This configuration mimics the behavior of WMF sites.

# [...]

server_tokens off;
set_real_ip_from localhost;
real_ip_header X-Forwarded-For;

map $cookie_stopMobileRedirect $mobile_redirect {
	default ?01;
	"" ${http_sec_ch_ua_mobile}1;
}

ssl_certificate /path/to/ssl-certificate.pem;
ssl_certificate_key /path/to/ssl-certificate-key.pem;
ssl_dhparam /path/to/ssl-dhparams.pem;

server {
	listen 443 ssl;
	listen [::]:443 ssl;

	root /var/www/html/example;

	index index.php;

	server_name localhost;

	location ~ ^/w/(index|load|api|thumb|opensearch_desc|rest|img_auth)\.php$ {
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_pass unix:/run/php/php8.1-fpm.sock;
	}

	location /w/images {}

	location /w/images/deleted {
		deny all;
	}

	location ~ ^/w/resources/(assets|lib|src) {
		try_files $uri 404;
		add_header Cache-Control "public" always;
		expires 7d;
	}

	location ~ ^/w/(skins|extensions)/.+\.(css|js|gif|jpg|jpeg|png|svg|wasm|ttf|woff|woff2)$ {
		try_files $uri 404;
		add_header Cache-Control "public" always;
		expires 7d;
	}

	location = /w/images/favicon.svg {
		add_header Cache-Control "public" always;
		expires 7d;
	}

	location = /favicon.ico {
		rewrite ^ /w/images/favicon.ico;
	}

	location = /w/images/favicon.ico {
		add_header Cache-Control "public" always;
		expires 7d;
	}

	location /w/sitemap {}

	location = /sitemap.xml {
		rewrite ^ /w/sitemap/sitemap-index-wiki.xml;
	}

	location ~ ^/w/(COPYING|CREDITS)$ {
		default_type text/plain;
	}

	location /w/rest.php/ {
		try_files $uri $uri/ /w/rest.php?$query_string;
	}

	location /wiki/ {
		rewrite ^/wiki/(?<pagename>.*)$ /w/index.php;
	}

	location = / {
		return 301 /wiki/Main_Page;
	}

	location / {
		return 404;
	}

	error_page 404 /w/images/404.html;

	location /w/images/404.html {
		internal;
	}
}

server {
	listen 80 default_server;
	listen [::]:80 default_server;

	server_name wiki.example.com;

	return 301 https://$host$request_uri;

	return 404;
}

server {
	listen 443 default_server ssl;
	listen [::]:443 default_server ssl;

	server_name wiki.example.com;

	location / {
		if ($arg_mobileaction = toggle_view_desktop) {
			add_header Set-Cookie "stopMobileRedirect=true; Domain=.wiki.example.com; Path=/; Max-Age=2592000; HttpOnly; Secure";
			break;
		}

		if ($mobile_redirect != ?01) {
			return 302 https://m.wiki.example.com$request_uri;
		}

		if ($http_host != wiki.example.com) {
			return 301 https://wiki.example.com$request_uri;
		}

		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass https://localhost;
	}
}

server {
	listen 443 ssl;
	listen [::]:443 ssl;

	server_name m.wiki.example.com;

	location / {
		if ($arg_mobileaction = toggle_view_mobile) {
			add_header Set-Cookie "stopMobileRedirect=; Domain=.wiki.example.com; Path=/; Max-Age=0; HttpOnly; Secure";
		}

		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Subdomain m;
		proxy_pass https://localhost;
	}
}

LocalSettings.php should contain the following:

$wgMFAutodetectMobileView = false;
$wgMobileUrlCallback = fn ( $domain ) => "m.$domain";
$wgCookieDomain = ".wiki.example.com";