Warum funktionieren Abfragen mit einem Schrägstrich, aber ohne Schrägstrich werden in meiner Nginx-Konfiguration 404-Werte angezeigt?

1

Gegen unten nginx config:

upstream search {
          least_conn;
          server www.google.com:80
              max_fails=1
              fail_timeout=10
              weight=1;
            keepalive 12;
        }
    limit_req_zone $binary_remote_addr zone=search:1m rate=10r/s;

resolver 127.0.0.1;

server {
  listen 80 default_server;
  charset utf-8;
  server_name _;

  access_log /dev/stdout json;

    location @search {
      # Deny requests that do not match allowed methods REGEX
      if ($request_method !~ ^GET$ ) {
        return 405;
      }
      set $proxy_uri $uri;
      if ($proxy_uri ~ ^/[^/]+(/.*)$ ) {
        set $proxy_uri "$1";
      }
      # Deny requests that do not match allowed paths REGEX
      if ($proxy_uri !~ ^.*(\?|$) ) {
        return 403;
      }

      # Rate Limit Requests
      limit_req zone=search burst=10 nodelay;

      # Adding new client_max_body_size service attribute per location
      client_max_body_size 1m;
      proxy_http_version 1.1;
      # Set CORS Headers
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
      proxy_set_header Origin "";
      proxy_set_header Connection "";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass http://search$proxy_uri$is_args$args;
      }

    location /search/ {
      client_max_body_size 1m;
      # send request to the named location for the service
      error_page 418 = @search; return 418;
    }
  # Default location for unmatched requests
  location / {
      return 404;
    }

  location = /health {
    return 200;
  }
}

Laufen

curl -siL  -H 'Host: www.google.com' '127.0.0.1/search/' 

Gibt eine 200 zurück

aber

curl -siL  -H 'Host: www.google.com' '127.0.0.1/search' 

Gibt einen 404 zurück.

Wie mache ich mit und ohne den Schrägstrich 200?

Josh Beauregard
quelle
1
Der Titel ist widersprüchlich, "no slash" und "no trailing slash" klingen gleich. Sie meinen "mit Schrägstrich funktioniert" und "kein abschließender Schrägstrich" nicht?
Xen2050
Es stimmt, ich habe das bei der EOD gemacht und habe nicht klar gedacht. Vielen Dank
Josh Beauregard
1
Sie können versuchen, zu ändern location /search/ zu location /search. Andernfalls möchten Sie sich das vielleicht ansehen StackOverflow-Frage über das Hinzufügen eines abschließenden Schrägstrichs mit Regex.
Anaksunaman

Antworten:

0

Ich habe eine ähnliche Erfahrung gemacht, allerdings in einer anderen Umgebung, daher müssen Sie sie möglicherweise selbst testen, um dies zu überprüfen. Auf Apache zum Beispiel, wenn Sie dies zulassen CORS (Cross Origin Resource Sharing), scheint es nur zu funktionieren, wenn ein abschließender Schrägstrich angezeigt wird. Die einzige Erklärung, die ich dafür finden konnte, war, dass der Server in der Lage sein muss, explizit zwischen Verzeichnissen und Dateien zu unterscheiden (schließlich kann eine Datei keine Erweiterung haben und am Ende wie ein Verzeichnis aussehen, und ein Verzeichnisname auch ein Punkt und sehen am Ende aus wie eine Datei), um zuzulassen oder zu verbieten CORSund folglich fast jede Abfrage, die Sie auf Ihrem Server ausführen. Führen Sie Ihre Tests durch und prüfen Sie, ob dies in Ihrem Fall zutrifft.

Trouble Zero
quelle