2016-04-28 2 views
2

Ich habe eine bestimmte Datei (ich kann diese Datei die file-handler nennen) auf meinem Server, die alle Anfragen an Dateien mit einer bestimmten Erweiterung behandeln sollte. Die file-handler selbst sollte jedoch nicht direkt zugänglich sein.Wie schreibt man eine bestimmte URL in 404 um, erlaubt aber den Zugriff auf dieselbe URL durch eine andere umgeschriebene URL?

Was ich versuche:

  • Legen Sie die file-handler in einem passwortgeschützten Verzeichnis. Leider führt jede URL, die in dieses spezielle Verzeichnis geschrieben wird, dazu, dass der Browser (daher der Server) nach dem Passwort fragt, so dass diese Methode nicht funktioniert.
  • Schreiben Sie den direkten Zugriff auf die file-handler auf die 404-Standardseite um. Leider führt jede URL, die in file-handler umgeschrieben wurde, dazu, dass mod_rewrite die 404-Seite bedient.

Quelle für die zweiten Versuch:

RewriteBase/
RewriteRule dontallowdirectaccess\.xxx$ - [R=404,L] 

#Only serve existing files to the file-handler 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule \.ext$ dontallowdirectaccess.xxx [QSA,L] 

Antwort

2

Für die ersten 404 Regel Verwendung THE_REQUEST Variable erzwingen. THE_REQUEST Variable stellt ursprüngliche Anfrage von Apache aus dem Browser empfangen und wird nicht nach der Ausführung einiger Rewrite-Regeln im Gegensatz zu REQUEST_URI Variable überschrieben.

RewriteCond %{THE_REQUEST} /dontallowdirectaccess\.xxx[?\s/] [NC] 
RewriteRule^- [R=404,L] 

#Only serve existing files to the file-handler 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule \.ext$ dontallowdirectaccess.xxx [L] 
+0

Danke, das scheint zu funktionieren, obwohl ich den [? \ S /] Teil entfernt habe. Es funktioniert jedoch nicht, wenn ich den [? \ S /] Teil durch das Ende-der-Zeichen-Flag ($) ersetze, es dient mir nur der Seite, warum ist das? –

+0

Weil '$' das Ende der Eingabe bedeutet, während der Beispielwert dieser Variablen 'GET /index.php?id=123 HTTP/1.1' ist, damit es nicht mit der URI selbst endet. – anubhava

+1

Das räumt auf, danke! –

0

So habe ich herausgefunden, dass sie eigentlich eine andere Art und Weise, dies zu tun, die Sie nicht die {THE_REQUEST} Variable zu analysieren erfordern.

#Only serve existing files to the file-handler (directories not included) 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule (^.+\.ext$) dontallowdirectaccess.xxx?file=$1 [QSA,L] 

#If ENV:REDIRECT_STATUS is empty than someone must be trying to access the file directly. 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule dontallowdirectaccess\.xxx$ - [R=404,L] 
Verwandte Themen