Puncte:1

rescrie și forță redirecționarea la adresa URL de origine a rescrierii în nginx

drapel in

Am acest exemplu în care o căutare html <form> o obligă să meargă la /search/index.php?q=term și aș dori să folosesc ceva de genul /termen de căutare in schimb.

Iată cum arată configurația acum:

locație /căutare/ {
    rescrie ^/search/(.+) /search/index.php?q=$1;
}

Accesarea directă a acestei locații funcționează, dar în momentul completării formularului și al căutării acestuia se va folosi „origina” mai degrabă decât rescrie.

Am încercat să folosesc redirecționarea „înapoi”, dar asta a blocat serviciul nginx:

locație /căutare/ {
    rescrie ^/search/(.+) /search/index.php?q=$1;
    redirecționare ^/search/index.php?q=(.+) /search/$1;
}

Am incercat si rescrie cu permanent steag, care nu a făcut nimic

locație /căutare/ {
    rescrie ^/search/(.+) /search/index.php?q=$1;
    rescrie ^/search/index.php?q=(.+) /search/$1 permanent;
}

Știu că este posibil să obții același lucru în PHP cu ceva de genul acesta:

// În partea de sus a /search/index.php
dacă (str_starts_with($_SERVER['REQUEST_URI'], '/search/index.php')){
    $protocol = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "https")? "https": "http";
    $server = $_SERVER['HTTP_HOST'];
    $interogări = array();
    parse_str($_SERVER['QUERY_STRING'], $interogări);
    $căutare = $interogări['q'] ?? "";
    header("Locație: $protocol://$server/căutare/$căutare");
}

Dar gândiți-vă că ar fi mai bine dacă nginx ar putea face față acestui lucru (dacă este posibil).

Știe cineva cum să rescrie și să redirecționeze accesul de la origine?

Richard Smith avatar
drapel jp
Nu știu ce este comanda `redirect`. Dar puteți afișa intrarea din jurnalul de acces pentru cererea care eșuează?
Typewar avatar
drapel in
@RichardSmith Ok, înțeleg, am greșit pentru început.L-am luat de aici https://ubiq.co/tech-blog/rewrite-vs-redirect-nginx/ . Jurnalul Nginx systemd spune într-adevăr că este o directivă necunoscută
Richard Smith avatar
drapel jp
Ce vrei să spui prin „origine”? Vrei să spui că formularul trimite o solicitare către `/search/index.php?...` și ai dori ca bara de adrese a browserului să fie schimbată în `/search/...`?
Typewar avatar
drapel in
Da, sau mai precis: `/search/index.php?q=[term]` și redirecționați-l către `/search/[term]`
Puncte:1
drapel jp

Configurația existentă este ceva de genul:

locație /căutare/ {
    rescrie ^/search/(.+) /search/index.php?q=$1;
}
locație ~ \.php$ {
    ...
}

URI-ul /search/index.php este folosit intern, deci se încearcă utilizarea rescrie ^/search/index.php?q=(.+) /search/$1 permanent; va genera o buclă de redirecționare.

Pentru a identifica URI ca un cerere externă, trebuie să te uiți la $request_uri variabil. Și pentru asta, va trebui să utilizați cele infame dacă afirmație. De exemplu:

if ($request_uri ~ ^/search/index\.php\?q=(.+)) {
    returnează 301 /căutare/$1;
}
locație /căutare/ {
    rescrie ^/search/(.+) /search/index.php?q=$1;
}
locație ~ \.php$ {
    ...
}
Typewar avatar
drapel in
Bine, înțeleg. Am încercat să pun instrucțiunea if în sfera lui `/search/`, dar nu a funcționat. În afara domeniului de aplicare funcționează. Mulțumesc mult!
Richard Smith avatar
drapel jp
Într-adevăr, URI-ul `/search/index.php` este gestionat de blocul `location ~ \.php$`, deoarece se termină în `.php`.
Typewar avatar
drapel in
Ahh! are sens, mulțumesc pentru clarificare
drapel us
De asemenea, se poate folosi `if ($arg_q ~ (.+))` ca condiție `if`. Se potrivește numai atunci când argumentul de interogare `q` nu este gol. Utilizarea `$request_uri` nu este necesară.

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.