Warum erhalte ich einen 404 Not Found, wenn ich versuche, den Serverstatus abzurufen?

8
<Location /status>
    SetHandler server-status
    order deny,allow
    allow from all
</Location>

Aber wenn ich besuche http://ip:port/status,

a 404 Not Foundwird gemeldet, warum?

Linux
quelle
Erstellen Sie zum Teufel eine index.html-Datei in diesem Verzeichnis und sehen Sie, was passiert.
John Gardeniers
@ John Gardeniers, MUSS dieses Verzeichnis überhaupt existieren? Ich habe Ihren Rat befolgt, aber nichts anderes bekommen ...
Linux
Offensichtlich muss das Verzeichnis existieren oder Sie müssen immer eine 404 dafür bekommen, weil der Server nicht bedienen kann, was nicht da ist. Der Grund, warum ich vorgeschlagen habe, die Indexdatei zu erstellen, ist, dass je nach Konfiguration Ihres Setups das Fehlen einer Indexdatei zu einem 404 führen kann, sofern Sie nicht ausdrücklich eine andere Datei angeben, die in Ihrer URL vorhanden ist.
John Gardeniers
1
@ John: Für eine server-status? Ich musste nie eine physische Datei auf der Festplatte haben, um server-statusarbeiten zu können.
womble
2
@ John Gardeniers, warum wird die Datei noch benötigt, wenn sie von verarbeitet wird SetHandler server-status?
Linux

Antworten:

17

Dies kann auch passieren, wenn Sie eine .htaccessDatei im Dokumentstamm haben und diese Datei eine enthält RewriteRule, wie es bei hübschen CMS-URLs üblich ist.

Die Erklärung für dieses Verhalten lautet wie folgt. Die <Location>Anweisungen handeln zuerst, aber der Handler wird zu diesem Zeitpunkt nicht aufgerufen. Dann RewriteRulesetzt das einen Handler, zB um ein PHP-Skript auszuführen, SetHandlerhat also am Ende keine Auswirkung.

Wenn dies die Ursache ist, suchen Sie die Ursache RewriteRule(*) und fügen Sie sie hinzu:

RewriteCond %{REQUEST_URI} !=/server-status

Dies schließt den server-statusURI RewriteRuleauf die gleiche Weise aus, wie vorhandene statische Dateien ausgeschlossen werden können. Natürlich /server-statusmuss das Location, was Sie anstelle von verwenden, genau mit dem gewählten übereinstimmen , was in der Frage stattdessen steht /status. (Getestet auf Apache 2.2.22 und Apache 2.4)

Nachtrag: Beachten Sie auch, dass Sie einen 403 erhalten können, der versucht, das zu lesen, server-statuswenn das DocumentRootvom Apache-Prozess überhaupt nicht lesbar ist, da der Server-Status-Handler keine Chance hat, zu arbeiten.

Anhang 2: Wenn die .htaccessfür die Apache-Standardwebsite häufig überschrieben wird und die /server-statusURL erforderlich ist, damit beispielsweise Munin funktioniert, ist das Erstellen einer <VirtualHost 127.0.0.1:80>Zeilengruppe mit dem Serverstatus-Handler möglicherweise administrativ am einfachsten.

Anhang 3 (*): Das RewriteRuleProblem verursacht möglicherweise alles, was mit der Zeichenfolge übereinstimmt /server-status. Dies kann erkennbar sein, weil der erste Parameter mit etwas übereinstimmt, z. B. dort, RewriteRule .wo .er mit einem beliebigen Zeichen übereinstimmt ^(.*), oder auf andere Weise den URI abfängt, z .*\bstatus$. Sie können es auch identifizieren, weil es vorhandene Dateien mit absichtlich ausschließt !-f.

Wenn beispielsweise WordPress die Hauptseite ist und Sie /server-statusdarauf erscheinen möchten und aus irgendeinem Grund Addendum 2 oben nicht anwendbar ist, möchten Sie möglicherweise eine zusätzliche Site RewriteCondwie folgt einfügen :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/server-status
RewriteRule . /index.php [L]

Es schadet jedoch wahrscheinlich vor keinem RewriteRule.

Cedric Knight
quelle
Es funktionierte unter Apache / 2.4.6 (CentOS7).
Ali Yousefi Sabzevar
1
Dies war auch bei meinem Apache 2.4.10 unter Debian der Fall. VIELEN DANK!
Lucaferrario
In den Apache-Dokumenten ist festgelegt, dass Sie RewriteEngine onfür jeden virtuellen Host, in dem Sie Umschreiberegeln verwenden möchten, eine Direktive benötigen . Ich denke, dies bedeutet, dass ich die oben genannten RewriteCondPunkte jeweils einmal konfigurieren müsste RewriteRule. Deshalb habe ich mich entschieden, ein <VirtualHost 127.0.0.1>wie in Anhang 2 oben vorgeschlagenes zu erstellen , um mit mehreren umzugehen RewriteRules. Und es scheint zu funktionieren!
CODE-REaD
@ CODE-REaD Die Erwähnung RewriteEngineist ein roter Hering. Es muss bereits sein, ondass die Regel eingreift /server-status. Ich habe jedoch nicht gesagt, wie man die Regel identifiziert, "die das Problem verursacht", und vielleicht sollte ich das Hinzufügen der Zeile für jede Regel sparen: Die Regel ist wahrscheinlich eine generische Regel, bei der der erste Parameter ist .oder sein .*kann vorangestellt von anderen RewriteCondAnweisungen wie dem Ausschließen einer Datei !-f.
Cedric Knight
danke, der schuldige war htaccess
Marco Marsala
4

Ich würde vermuten, dass Sie das Statusmodul nicht geladen haben - können Sie es bestätigen?

clmssz
quelle
Dies ist die richtige Antwort. Hat perfekt funktioniert. Vielen Dank.
Gabriel Rodriguez
3

Weil du etwas falsch konfiguriert hast. Was sagen Ihre Protokolle über die Ursache des 404 aus? Meine erste Vermutung wäre, dass dies ip:portkein gültiger vhost ist (oder zumindest nicht gültig für den vhost, den Sie eingegeben haben <Location /status>), und dass er wahrscheinlich auf den Standard-vhost zurückfällt. In den Fehlerprotokollen werden irrationale Pfade erwähnt, die Sie nicht konfiguriert haben, wenn dies der Fall ist. Andere Fehlerprotokollmeldungen bedeuten andere Dinge, weshalb es so wichtig ist, sie zu überprüfen.

womble
quelle
Das Protokoll sagt auchFile does not exist
Linux
1
Natürlich tut es, das ist , warum Sie ein 404. bekam Aber was sonst sagt er?
womble
Es sagt nichts anderes.
Linux
2
Zumindest wird Ihnen mitgeteilt, welche Datei nicht vorhanden ist.
womble
0
  • Sie müssen kein Verzeichnis, keinen Pfad oder keine Indexdatei konfigurieren
  • Versuchen Sie einen anderen Port? Sie sollten nicht Port 80 sein

Die Dokumente sind:

<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
</Locaton>

Ihr Standort unterscheidet sich, ich würde nicht denken, dass es wichtig sein sollte, aber versuchen Sie Ihren Standort als / server-status anstatt nur / status.

Ich denke jedoch, dass Spud Recht hat. Sie haben dieses Modul nicht geladen.

-sean

Sean Kimball
quelle
0

Wenn Sie WampServer verwenden , wie ich es für die Entwicklung bin, notieren Sie Folgendes:

  • Die httpd-info.confDatei unter wamp\bin\apache\apache[version]\conf\extraenthält die entsprechende <Location>Konfiguration:

    <Location /server-status> SetHandler server-status #Require host .example.com #Require ip 127 </Location>

  • Diese Datei kann tatsächlich in Ihrer Apache-Konfiguration enthalten sein oder nicht. Suchen Sie in Ihrer httpd.confDatei nach der folgenden Zeile und stellen Sie sicher, dass sie nicht kommentiert ist:

    Include conf/extra/httpd-info.conf

In meinem Fall war das Hauptproblem das letztere: Die Zeile wurde standardmäßig kommentiert und daher httpd-info.confnicht einmal geladen.

JYelton
quelle
0

https://serverfault.com/a/388457/ hatte die Antwort für mich. Muss den Anruf aktiv blockieren, anstatt zu versuchen, jede .htaccess RewriteRule zu finden / zu blockieren, die die Anforderungsbearbeitung stört.

Ich fügte hinzu:

RewriteRule ^/server-status - [L]

In den Standortblock, und es begann zu arbeiten.

Kirrus
quelle
-1

Wenn Sie die Konfiguration von mod_rewrite und vhost verwenden, müssen Sie einen leeren vhost-Eintrag oben in der vhost-Konfigurationsdatei hinzufügen, z

<VirtualHost *:80>
</VirtualHost>

Dann können Sie über die Server-IP-Adresse darauf zugreifen, z. B. IP-Adresse / Server-Status

Nomad77
quelle
SetHandler server-statusBenötigen Sie nicht auch einen in diesem vhost?
Ladadadada