Entwickler-Ecke

Sonstiges (Web-Entwicklung) - Apache behandelt Datei ohne Endung als Verzeichnis


GruppeCN - Sa 03.09.11 12:54
Titel: Apache behandelt Datei ohne Endung als Verzeichnis
Moin moin zusammen,
vielleicht sind hier ja auch ein paar Apache-Spezis dabei, die mir bei folgendem Problem weiterhelfen können:

Habe z.B. folgende URLs:
/ajax/test
/ajax/test/56
/ajax/test/42

Dabei wird das ganze per mod_rewrite auf mein Skript verwiesen, wenn unter der URL keine Datei existiert.

Wenn die URL ohne ID (also /ajax/test) aufgerufen wird, speichert das Skript seine Ausgabe in die Datei /ajax/test (ohne Dateiendung!) - beim nächsten Aufruf der URL existiert die Datei dann und wird direkt von Apache ausgeliefert, ohne dass das Skript bemüht werden muss. Das funktioniert soweit gut.

Allerdings kriege ich (sobald diese Datei existiert) bei einer URL MIT ID auf einmal einen 404 Fehler.
D.h. es existiert eine Datei /ajax/test und ich rufe auf: /ajax/test/123 und erhalte einen 404 Fehler.

Weiß da jemand, was das Problem sein könnte?

Der Vollständigkeit halber noch meine ModRewrite Anweisungen:

Quelltext
1:
2:
3:
4:
5:
6:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]



Moderiert von user profile iconChristian S.: Topic aus Off Topic verschoben am So 15.07.2012 um 12:50


BenBE - Sa 03.09.11 13:12

Existierende Dateien haben vorrang vor Redirects durch mod_rewrite. Zudem ist

/some/url/index.php/abc

durchaus eine gültige URL und führt /some/url/index.php aus, wobei /abc als QUERY_STRING an das CGI weitergereicht wird. Ist index.php eine reguläre Datei, wird IIRC /abc verworfen. Woher der 404 bei Dir jetzt kommt, wüsste ich grad nicht. Der Apache bietet aber für mod_rewrite eine Möglichkeit das Debugging der Pfad-Auflösung stark zu verbosieren ;-) Schau mal, ob Du dann was findest.

In der Regel gilt aber: Alles was man mit mod_rewrite umschreiben will, sollte nicht real im logischen Namensraum bereits existieren.


GruppeCN - So 04.09.11 16:22

Okay, vielen Dank erstmal! Wenn es eine Dateiendung gibt, dann stimmt das was du sagtest, dann wird bei index.php/hallo die index.php ausgeführt. Aber ohne Dateiendung scheint das nicht so zu sein, denn sonst würde meine Datei /abc/test einfach ausgegeben werden, wenn ich /abc/test/123 aufrufe, statt den 404 Fehler zu produzieren. Ich werde mich am Montag mal ausführlicher mit RewriteLog beschäftigen, aber das scheint ja "by design" so zu sein, dass die RewriteCond in so einem Fall auf den Dateinamen mit der Option -f anspricht.