2017-03-16 3 views
1

Ich habe eine Website in "/ Verzeichnis /" und eine spezielle Variante der Website in "/ Verzeichnis/Unterverzeichnis /", die nur durch ein paar bestimmte IP-Adressen zugänglich sein sollte. Das Unterverzeichnis ist jedoch eine virtuelle URL. Der Website-Code befindet sich in diesem Beispiel immer noch im übergeordneten Verzeichnis namens "directory". Also muss ich neu schreiben.Wie Umschreiben nach dem Verweigern

Dies ist der relevante Teil meiner aktuellen nginx Konfigurationsdatei:

location /directory { 
    # here are various rewrites for my website 

    location /directory/subdirectory/ { 
     allow 10.0.0.0/8; # example range of IP addresses allowed 
     deny all; # disable access for others 
     rewrite ^/directory/subdirectory/(.*)$ /directory/$1 last; # the website location is still in the parent folder but the PHP code knows this specific version is to be used when the user surfs into subdirectory, which is why there is this rewrite 
    } 

    try_files $uri $uri/ /directory/index.php?q=$uri&$args; 
} 

location ~ \.php$ { 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
    include fastcgi.conf; 
    fastcgi_read_timeout 43200; 
} 

Das Problem, das ich bin vor: Ich weiß nicht, wie die Ausführung zu stoppen, sobald die „deny all“ hits. Wenn Sie in das Unterverzeichnis surfen, wird das Neuschreiben immer ausgeführt, unabhängig davon, ob Ihre IP-Adresse von den darüber liegenden Direktiven erlaubt ist oder nicht. So jemand surft in das Unterverzeichnis mit einer IP-Adresse, die nicht erlaubt ist, kann die Website im Unterverzeichnis sehen, was natürlich nicht das ist, was ich will. Wenn ich das Neuschreiben auskommentiere, funktionieren die allow/deny-Anweisungen so, wie sie sollen.

Also: wie kann ich angeben, dass diese Umschreibung NUR ausgeführt werden soll, wenn der Besucher nicht abgelehnt wird? Versucht, "error_page 403 /403.html;" zu diesem Ort nach dem "alles verneinen"; Direktive, aber es ändert nur die 403-Seite (und kann nur wieder gesehen werden, wenn die Rewrite-Regel im Unterverzeichnis kommentiert wird). Habe schon seit Tagen das Netz mit verschiedenen Suchbegriffen durchsucht, um das möglich zu machen, und habe mit Variationen der Config herumgespielt, aber ohne Erfolg.

Auch: das "deny all" funktioniert nicht mehr, sobald ich auf eine URL innerhalb des Unterverzeichnisses surfe, die mit ".php" endet. Ich nehme an, dass es wegen der "location ~ .php $" - Direktive ist, die aus irgendeinem Grund Vorrang vor den verschachtelten Standort-Direktiven erhält. Ich konnte dieses Problem umgehen, indem Sie:

location ^~ /directory/subdirectory/ { 
    allow 10.0.0.0/8; # example range of IP addresses allowed 
    deny all; # disable access for others 
    rewrite ^/directory/subdirectory/(.*)$ /directory/$1 last; 
} 

location /directory { 
    # here are various rewrites for my website 

    try_files $uri $uri/ /directory/index.php?q=$uri&$args; 
} 

location ~ \.php$ { 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
    include fastcgi.conf; 
    fastcgi_read_timeout 43200; 
} 

Nun ist die „Lage^~/Verzeichnis/Unterverzeichnis /“ Richtlinie erhält Vorrang vor der „location ~ .php $“ Richtlinie, die die „deny all“ Arbeit macht, aber ich Ich weiß nicht, ob das der richtige Weg ist, denn es scheint nicht die Lösung zu sein, die am besten "klar zu lesen" ist, weil ich etwas aus dem "Verzeichnis /" aus diesem Standortblock heraus bewege. Und auch das löst mein Hauptproblem immer noch nicht (nur das "rewrite ^/directory/-Unterverzeichnis /(.*)$/directory/$ 1 last;" wird für erlaubte IP-Adressen ausgeführt und nicht die, die vom "deny" abgelehnt werden ..., in dem alle“

Danke

Antwort

1

Das Problem, das Sie auf den Vorrang/Bestellung wird im Zusammenhang stehen vor nginx es Richtlinien behandelt kann eine detaillierte Erklärung gefunden here (hats off to the author!) werden:

in ihrer Ausführung Reihenfolge die Phasen sind nach dem Lesen, Server-Rewrite, Find-Config, Neuschreiben, Post-Rewrite, Preaccess, Zugang, Post-Access, Try-Dateien, Inhalte und schließlich log

Da „umschreiben“ kommt vor „Zugang“, die „umschreiben“ Richtlinie zuerst behandelt wird.

Da "wenn" in "umschreiben" -Phase ebenso behandelt wird, könnte man schreiben:

location ~ \.php$ { 
if ($remote_addr != "172.17.0.1") { 
    return 403; 
} 
rewrite^/your-redirect last; 
} 
Verwandte Themen