Puncte:0

Redirecționare mobilă în nginx cu șir de interogare

drapel lc

Încerc să redirecționez vizitatorii de pe dispozitive mobile către pagini AMP cu nginx. Practic am folosit scriptul @ https://gist.github.com/dangayle/2919206 cu modificări recomandate, plus elemente din răspunsul @ adăugați o cale de sufix URL (pentru AMP mobil) fără a provoca o buclă de redirecționare în nginx_

Principala diferență aici este că nu încerc să redirecționez utilizatorii mobili către un subdomeniu mobil, ci doar adaug un șir de interogare ("?amp=1"):

Acesta este codul din blocul HTTP pentru nginx.conf:

    implicit 0;

    „~* (android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo |midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6) 0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino" 1;

    „~* ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)| al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s ) |avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi |ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do( c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa |ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit |hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p |s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno |ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi )|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo) |mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5 )|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti| wv)|oran|owg1|p800|p an(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt| se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks| rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c (\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar| b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18 )|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3| m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)| vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)" 1;
}

și codul rămas în locație /:

setați $mobile_rewrite do_not_perform;

dacă ($mobile_agent = 1){
    set $mobile_rewrite perform;
}

dacă ($mobile_agent = 1){
    set $mobile_rewrite perform;
}

#verificați dacă interogarea arg = yes (example.com?mobile=yes), setați variabila
dacă ($arg_mobile = 'da') { 
    add_header Set-Cookie mobil=da;
    set $mobile_rewrite perform;
}

#verificați dacă cookie-ul mobil=da, setați variabila
if ($cookie_mobile = 'da') { 
    set $mobile_rewrite perform;
}

#verificați dacă cookie-ul mobil=nu, pauză
if ($cookie_mobile = 'nu') { 
    setați $mobile_rewrite do_not_perform;
}

#verificați dacă interogarea arg = nu (example.com?mobile=nu), break
dacă ($arg_mobile = 'nu') { 
    add_header Set-Cookie mobil=nu;
}

#dacă $mobile_rewrite = perform, faceți redirecționarea
if ($mobile_rewrite = executa) {
    rescrie ^.*(?<!/?amp=1)$ $scheme://www.cnx-software.es$request_uri?amp=1 break;
}

Încă am probleme cu redirecționările blocate într-o buclă. De exemplu: https://www.cnx-software.es/2021/08/31/arm-china-ahora-es-totalmente-independiente-de-arm/?amp=1?amp=1&amp=1?amp=1&amp=1 ?amp=1&amp=1?amp=1&amp=1?amp=1&amp=1...

Problema este probabil linia de rescriere, dar am reușit să identific exact problema.

Puncte:1
drapel us

Încercați să faceți o potrivire negativă în regex pentru a preveni rescrierile când amp argumentul interogării este 1 în adresa URL a cererii.

Este mai bine să faceți această verificare cu încă una dacă bloc:

dacă ($arg_amp = 1) {
    setați $mobile_rewrite do_not_perform;
}

Atunci rescrierea ta poate fi:

if ($mobile_rewrite = executa) {
    rescrie ^ $scheme://www.cnx-software.es$request_uri?amp=1 break;
}
drapel lc
Mulțumesc. Funcționează, este mult mai simplu decât ceea ce am încercat să fac. Am citit că ar trebui să evităm să folosim „dacă” în blocurile de locații. Dar oricum, dintr-un anumit motiv, redirecționarea a provocat o eroare 404 numai pe mobil și, după ce a mutat codul chiar sub linia server_name, acum este OK. O altă notă. nginx spune că returnarea ar trebui folosită în loc de rescrie atunci când este posibil în https://www.nginx.com/blog/creating-nginx-rewrite-rules/ Deci ar fi mai bine să folosești ceva de genul ```return 301 $scheme://www.cnx-software.es$request_uri?amp=1;``` Sau chiar nu contează?
drapel us
Mă gândeam să folosesc `return`, dar din moment ce ai folosit `break` cu `rewrite`, efectuează doar o rescriere internă. De asemenea, cred că o redirecționare permanentă nu este bună în acest caz.
drapel lc
Tocmai am observat că acest lucru creează o problemă cu linkurile partajate pe Facebook sau alte surse care adaugă unul sau mai multe șiruri de interogare. Așa că am creat o hartă `harta $is_args $separator { Mod implicit "?"; "?" „&”; }` și am schimbat rescrierea după cum urmează: `rewrite ^ $scheme://www.cnx-software.es$request_uri${separator}amp=1 break;` Aproape că funcționează, dar din anumite motive, după o primă redirecționare care o face: https://www.cnx-software.es/2021/09/23/un-primer-vistazo-a-la-placa-de-desarrollo-microchip -polarfire-soc-fpga-icicle/?fbclid=xxx&amp=1, merge într-o buclă cu $arg_amp=1 nedetectat.
drapel lc
Interesant... Dacă dau clic pe linkul cu ?fbclid=xxx&amp=1, atunci funcționează, dar nu când merg la un link doar cu ?fbclid=xxx. Se pare că redirecționarea mea creează în schimb o legătură cu „?fbclid=xxx&amp=1?fbclid=xxx”... Deci valoarea amp arg este „1?fblcid=xxx”... Cum este posibil?
drapel us
Acest lucru se poate întâmpla din cauza comportamentului implicit al nginx de a adăuga șiruri de interogare la rescrieri. Îmi voi rafina răspunsul pentru a aborda acest lucru.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.