J'ai ce cas où une recherche html l' <form>oblige à aller /search/index.php?q=termet je voudrais utiliser quelque chose comme à la /search/termplace.

Voici à quoi ressemble la configuration en ce moment :

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
}

L'accès direct à cet emplacement fonctionne, mais au moment de remplir le formulaire et de le rechercher, il utilisera "l'origine" plutôt que la réécriture.

J'ai essayé d'utiliser la redirection "vers l'arrière", mais cela a planté le service nginx :

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
    redirect ^/search/index.php?q=(.+) /search/$1;
}

J'ai aussi essayé de réécrire avec permanentle drapeau, qui n'a rien fait

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
    rewrite ^/search/index.php?q=(.+) /search/$1 permanent;
}

Je sais qu'il est possible d'obtenir la même chose en PHP avec quelque chose comme ceci :

// On the top of /search/index.php
if (str_starts_with($_SERVER['REQUEST_URI'], '/search/index.php')){
    $protocol = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "https") ? "https" : "http";
    $server = $_SERVER['HTTP_HOST'];
    $queries = array();
    parse_str($_SERVER['QUERY_STRING'], $queries);
    $search = $queries['q'] ?? "";
    header("Location: $protocol://$server/search/$search");
}

Mais pensez que ce serait mieux si nginx pouvait gérer cela (si c'est possible du tout).

Est-ce que quelqu'un sait comment réécrire et rediriger l'accès depuis l'origine ?

answer

La configuration existante est quelque chose comme :

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
}
location ~ \.php$ {
    ...
}

L'URI /search/index.phpest utilisé en interne, donc toute tentative d'utilisation rewrite ^/search/index.php?q=(.+) /search/$1 permanent;générera une boucle de redirection.

Pour identifier l'URI en tant que requête externe , vous devez examiner la $request_urivariable. Et pour cela, vous devrez utiliser la fameuse if déclaration. Par example:

if ($request_uri ~ ^/search/index\.php\?q=(.+)) {
    return 301 /search/$1;
}
location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
}
location ~ \.php$ {
    ...
}