Dokumentacija

Skrajšajte verige preusmeritev

Skrajšajte verige preusmeritev

Preusmeritev pošlje brskalnik na drug naslov, preden se karkoli naloži. Ena je običajna: http:// na https:// ali www na naslov brez njega. Vsak dodaten skok je še ena pot do strežnika in nazaj, pogosto z novo povezavo in TLS rokovanjem. Na telefonu je to na skok nekaj sto milisekund praznega zaslona, še preden se stran sploh začne nalagati. Tudi iskalniki sledijo verigam, a na njih porabijo čas za pregledovanje in po nekaj skokih obupajo.

Kontrolni seznam strani sledi naslovu, ki ga uporablja vaš monitor, do končne strani in pričakuje največ eno preusmeritev.

Kako nastanejo verige

Tipična veriga zraste iz pravil, ki jih je vsakega z dobrim razlogom dodal drug človek na drugem mestu:

Korak Naslov Kdo preusmeri
1 http://www.example.com/ → https://www.example.com/ stikalo "force HTTPS" na nadzorni plošči gostovanja
2 https://www.example.com/ → https://example.com/ pravilo za www v .htaccess ali na CDN-ju
3 https://example.com/ → https://example.com/en/ vtičnik za jezike

Trije skoki, kjer bi zadostoval eden. Popravek je vedno isti: vsaka različica gre naravnost na končni naslov z enim pravilom. http://www.example.com/karkoli mora z enim samim 301 pristati na https://example.com/karkoli.

Drugi pogosti vzroki:

  • Poševnica na koncu. /about → /about/ (ali obratno) doda skok, kadar povezave in meni uporabljajo drugo obliko.
  • Neujemanje naslova v CMS-ju. WordPress preusmeri na naslov iz svojih nastavitev. Če tam piše https://www.example.com, strežnik pa obiskovalce pošilja na naslov brez www, se pravili bijeta: drug skok ali zanka.
  • CDN in izvorni strežnik. Cloudflare preusmeri http na https, nato strežnik preusmeri www na golo domeno. Vsako pravilo je samo zase v redu, skupaj pa naredita dva skoka.
  • Stare preusmeritve, ki kažejo na stare preusmeritve. /staro → /novejse → /najnovejse, po dveh prenovah.

Preverite sami

Sledite verigi in izpišite vsak korak. Namesto example.com vpišite svojo stran:

curl -sIL http://www.example.com/ | grep -iE '^(HTTP/|location:)'

Vsaka vrstica location: je ena preusmeritev. Popravljeno pomeni eno vrstico location: ali nobene, kadar začnete na končnem naslovu.

Vse štiri različice preizkusite naenkrat:

for u in http://example.com/ http://www.example.com/ https://example.com/ https://www.example.com/; do
  curl -sL -o /dev/null -w "$u → %{url_effective} (%{num_redirects} redirects)\n" "$u"
done

Vsaka vrstica se mora končati na istem naslovu z 1 ali 0 preusmeritvami.

Opomba: Brskalniki, ki glavo HSTS vaše strani že poznajo, skok z http:// opravijo interno. Novi obiskovalci, pajki iskalnikov in curl ga ne, zato ga štejte.

Kako popraviti

Ugotovite, od kod prihaja posamezen skok (izpis curl pokaže vrstni red), končni naslov naj pozna eno samo mesto, druga pa izklopite ali prepišite. Izberite, do česar imate dostop.

WordPress

  1. Settings → General: WordPress Address (URL) in Site Address (URL) morata biti natanko končni naslov, z https:// in z ali brez www tako, kot preusmerja strežnik. Neujemanje tu povzroči dodaten skok na vsaki strani.
  2. Vtičniki za preusmeritve. V vtičniku Redirection (Tools → Redirection) ali v preusmeritvah Yoast SEO Premium oziroma Rank Math poiščite verige: če /staro kaže na /novo in /novo na /najnovejse, naj /staro kaže neposredno na /najnovejse.
  3. Vtičniki za HTTPS. Če na https preusmerja Really Simple SSL in tudi vaš ponudnik gostovanja, obdržite eno. Preusmeritev vtičnika se izvede šele, ko se zažene PHP, zato je strežniško pravilo hitrejše.
  4. Vtičniki za jezike. Če / preusmeri na /en/, lahko WPML in Polylang privzeti jezik strežeta brez jezikovne mape ali nehata preusmerjati po jeziku brskalnika. S tem skok za domačo stran izgine.
  5. Trajne povezave. V menijih in vsebini uporabljajte povezave v isti obliki kot v Settings → Permalinks (s poševnico na koncu ali brez), da jih WordPress ne preusmerja.

Nato počistite predpomnilnik strani (WP Rocket, LiteSpeed Cache, predpomnilnik ponudnika gostovanja).

cPanel

cPanel ima dve ločeni stikali, ki ju je lahko zložiti eno na drugo: Domains → Domains → Force HTTPS Redirect in pravilo za www v Domains → Redirects. Skupaj naredita, da http://www potrebuje dva skoka.

Izklopite obe in namesto njiju uporabite eno pravilo v .htaccess:

  1. Odprite Files → File Manager, pojdite v public_html in v Settings označite Show Hidden Files (dotfiles).
  2. Uredite .htaccess in blok iz zavihka Apache in LiteSpeed postavite čisto na vrh, pred razdelek # BEGIN WordPress, če obstaja.
  3. Preizkusite z zanko curl zgoraj.

Plesk

  1. Websites & Domains → example.com → Hosting & DNS → Hosting: pri Preferred domain nastavite želeno obliko (z ali brez www) in vklopite Permanent SEO-safe 301 redirect from HTTP to HTTPS.
  2. Odstranite morebitna dodatna pravila za www ali https, ki ste jih z istim namenom dodali v .htaccess ali v Apache & nginx Settings.
  3. Vse štiri različice preizkusite z zanko curl zgoraj. Če http://www še vedno potrebuje dva skoka, Pleskova stikala izklopite in uporabite eno pravilo (zavihek nginx ali Apache).

nginx

Običajna napaka je blok za vrata 80, ki ohrani gostitelja (https://$host$request_uri), zato gre http://www najprej na https://www. Končnega gostitelja zapišite neposredno. Na Debianu in Ubuntuju je stran v /etc/nginx/sites-available/example.com, na Rocky, Alma in CentOS v /etc/nginx/conf.d/example.com.conf:

# Vsak http zahtevek, z www ali brez: en skok na končni naslov.
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

# https://www: prav tako en skok.
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    return 301 https://example.com$request_uri;
}

Certbot doda bloke if ($host = www.example.com) { return 301 https://$host$request_uri; }; ti ohranijo www in ustvarijo dodaten skok. Zamenjajte jih z bloki zgoraj.

Preizkusite in uveljavite:

sudo nginx -t && sudo systemctl reload nginx

Apache in LiteSpeed

Eno pravilo za http in www hkrati, na vrhu .htaccess ali v virtualnem gostitelju:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]

Odstranite starejša pravila, ki naredijo samo eno od obojega, sicer se še vedno izvedejo prva. Če imate raje www, uporabite RewriteCond %{HTTP_HOST} !^www\. [NC] in https://www.example.com.

Opozorilo: Za Cloudflarom ali drugim posrednikom je %{HTTPS} off tudi za obiskovalce na https, in to pravilo naredi zanko. Namesto prvega pogoja uporabite RewriteCond %{HTTP:X-Forwarded-Proto} !https ali preusmeritev naredite na Cloudflaru (zavihek Cloudflare).

Na lastnem strežniku preizkusite in znova naložite (na Rocky, Alma in CentOS namesto apache2 uporabite httpd):

sudo apachectl configtest && sudo systemctl reload apache2

Cloudflare

Always Use HTTPS (SSL/TLS → Edge Certificates) pošlje http://www na https://www; ločena preusmeritev za www nato doda drugi skok. Naredite eno pravilo za preusmeritev, ki ujame oboje:

  1. Pojdite v Rules → Redirect Rules in Create rule.

  2. Custom filter expression, nato Edit expression:

    (http.host eq "www.example.com") or (not ssl)
    
  3. URL redirect: tip Dynamic, izraz concat("https://example.com", http.request.uri.path), status 301, označite Preserve query string in Deploy.

Da se pravilo izvede, potrebuje gostitelj www DNS zapis prek posrednika (oranžen oblaček). Nato preverite, da izvorni strežnik ne preusmerja znova: če WordPress ali strežnik obiskovalce še vedno pošilja na www, nastane zanka. Rob in izvorni strežnik se morata strinjati o enem končnem naslovu.

Node.js in Next.js

Next.js privzeto preusmeri /about/ na /about (308), z trailingSlash: true pa obratno. V povezavah uporabljajte isto obliko. Za www zadostuje eno pravilo v next.config.js:

module.exports = {
    async redirects() {
        return [
            {
                source: '/:path*',
                has: [{ type: 'host', value: 'www.example.com' }],
                destination: 'https://example.com/:path*',
                permanent: true,
            },
        ];
    },
};

Na Vercelu ali Netlifyju preusmeritev med www in golo domeno raje nastavite v nastavitvah domen projekta in obdržite samo eno od obeh. Če pred aplikacijo stoji nginx, preusmeritev postavite tja (zavihek nginx) in ne na obe mesti.

Gostovane platforme

Shopify, Wix, Squarespace in Webflow vsako drugo domeno z enim skokom preusmerijo na tisto, ki jo označite kot primarno. Preverite, da je primarna domena tista, na katero povezujete: v Shopifyju Settings → Domains, v Webflowu privzeta domena v Site settings → Publishing. Veriga na teh platformah običajno izvira iz vaših vnosov na seznamu preusmeritev URL-jev platforme, ki kažejo na naslove, ki se znova preusmerijo.

Potrdite popravek

Znova poženite zanko curl iz razdelka Preverite sami, nato v PulseKeeperju odprite tarčo in na zavihku Kontrolni seznam kliknite Preveri zdaj. Postavka se v nekaj minutah obarva OK, ne šele ob naslednjem dnevnem preverjanju.