Apache: Redirect auf geschütztes Verzeichnis führt zu 401-Fehlerseite

GwenDragon

Registered User
Ich leite beim Apache mit mod_rewrite beim HTTP-Header Host, der am Anfang ein www hat, wie folgt um:

Code:
RewriteCond %{HTTP_HOST}	^(www\.)
RewriteRule (.*)		http://labs.gwendragon.de/$1 [R=301,L]

und Errordocuments sind wie folgt:
Code:
ErrorDocument 401 /login/index.html

Rufe ich jetzt aber nun ein geschütztes Verzeichnis auf
Code:
http://www.labs.gwendragon.de/tools/opera/extensions/beta/
landen Nutzer auf der 401er-Seite anstatt beim Login.

Ein Abruf der URL mit HEAD zeigt, dass erst der Redirect greift, dann aber eben nicht auf die URL ohne www führt, sondern auf die Fehlerseite.

Ist das lösbar, dass erst der Redirect erfolgt und dann mod_auth greift?
 
Wenn Du es richtig machst und mod_alias (RedirectMatch) verwendest, gibt es welchen Fehler? Logs?
 
Glaub' ich versteh, was los ist. Wie realisierst du denn das ganze? Poste bitte mal die betroffene Container-Kaskade. Also <VirtualHost>, <Directory>, was auch immer.

Die offensichtlichste und einfachste Lösung wäre, dass du für "www" einen eigenen vHost verwendest, und das gefrickel mit mod_rewrite sein lässt.

Edit: Versuch mal der Regel das NS-Flag hinzuzufügen, ob das was ändert.
 
Last edited by a moderator:
Es betrifft ja nicht nur eine Domain auf dem Server, die labs-Domain war nur ein Test-Beispiel. Wenn ich auch noch die www-Domains als extra VHost hinzufügen muss, wird die Verwaltung unübersichtlich. Auf dem System ist Plesk, weil manche Webseitenbetreiber die Verwaltung einfach haben wollen (bitte jetzt keine Diskussion über Plesk).

@Bachsau
NS im rewrite zu verwenden bringt nichts und dann landen Nutzer auch wieder auf der 401-Seite.



Die Konfig (bereinigt):
Code:
<VirtualHost 213.133.110.246:80>
    ServerName "labs.gwendragon.de:80"
    ServerAlias  "www.labs.gwendragon.de"
    ServerAlias  "ipv4.labs.gwendragon.de"
    UseCanonicalName Off

    DocumentRoot "/var/www/vhosts/gwendragon.de/labs/httpdocs"
    CustomLog /var/www/vhosts/labs.gwendragon.de/statistics/logs/access_log plesklog
    ErrorLog  "/var/www/vhosts/labs.gwendragon.de/statistics/logs/error_log"

    <Directory /var/www/vhosts/gwendragon.de/labs/httpdocs>
        Options -Includes -ExecCGI
    </Directory>

    Include "/var/www/vhosts/labs.gwendragon.de/conf/vhost.conf*"

</VirtualHost>


vhost.conf
Code:
<Directory /var/www/vhosts/gwendragon.de/labs/httpdocs>
	AllowOverride All

	DirectoryIndex index.html index.cgi index.pl
	
	Options -MultiViews -Indexes 
	Options -Includes -IncludesNOEXEC 
	Options -FollowSymLinks -execCGI

	<FilesMatch "\.(plx?|cgi)$">
		Options +FollowSymLinks +execCGI
		SetHandler cgi-script
	</FilesMatch>

	Order allow,deny
	Allow from all
    
    ###### Rewrites ######
    #
    RewriteEngine On
    RewriteBase	/

    RewriteCond %{HTTP_HOST}	^(www\.)
    RewriteRule (.*)		http://labs.gwendragon.de/$1 [R=301,NE,L]


</Directory>

### Alle beta-Unterverzeichnisse schützen
<LocationMatch "/(.+)/beta/">
# Login nur nach Einladung
    AuthType Basic
    AuthName "Geschuetzter Test-Bereich"
    AuthUserFile /var/www/vhosts/gwendragon.de/labs/httpdocs/login/.htpasswd
    AuthGroupFile /var/www/vhosts/gwendragon.de/labs/httpdocs/login/.htgroup
    Require group admins betatester

    ErrorDocument 401 /login/index.html
</LocationMatch>


Alias /cgi-bin/ /var/www/vhosts/gwendragon.de/labs/httpdocs/cgi-bin/
<Directory /var/www/vhosts/gwendragon.de/labs/httpdocs/cgi-bin>
	SetHandler default
	AllowOverride All
    
	DirectoryIndex index.pl index.cgi
	Options +FollowSymLinks -execCGI -Indexes
	
    	<FilesMatch "\.(plx?|cgi)$">
		Options +FollowSymLinks +execCGI
		SetHandler cgi-script
	</FilesMatch>

    	<FilesMatch "\.pm$">
		Deny from all
	</FilesMatch>

</Directory>

#########

Irgendwas, was da nicht passt?
 
Du hast die Rewrite-Anweisungen in einen Directory-Container gelegt. Das ist ein Fehler. Denn dann werden sie erst ausgeführt, nachdem der Server den Request-String auf das Dateisystem abgebildet hat. So darfst du es nicht machen.

Setze die Anweisungen direkt im VirtualHost-Container ein. <Location> und <LocationMatch> sind übrigens auch ganz böse, denn sie werden an letzter Stelle "drüber gemalt". Du solltest sie so selten wie möglich einsetzen, da ihre Auswirkungen nicht immer zu erfassen sind. Verlasse dich lieber auf <Directory> und <DirectoryMatch>.

Außerdem: Wenn dein Umgang mit www. alle vHosts betrifft, sei schlau, und lege stattdessen allgemeinere Rewrite-Regeln im Default-vHost an. Somit ersparst du deinen Server die Arbeit, diese bei jedem Request abzuarbeiten, und musst sie außerdem nicht in jeden vHost-Container packen. Ich mag auch keinem vorschreiben, wie er seinen Server konfiguriert, aber was du gepostet hast, sieht mir auf den ersten Blick danach aus, dass es auch sonst noch eine Menge Optimierungspotential bietet. Nahezu alles was im Abschnitt
<Directory /var/www/vhosts/gwendragon.de/labs/httpdocs> steht, kann getrost da raus. Bei den Options tut's auch "None", oder "-All", wenn du die MultiViews-Einstellung beibehalten willst.

bitte jetzt keine Diskussion über Plesk.
Du machst mir nicht den Eindruck, als wüsstest du nicht, was du tust. Wenn man Plesk bewusst einsetzt, und nicht, weil man sonst keine Ahnung hat, ist das völlig okay.
 
Last edited by a moderator:
Die Rewrite-Anweisung für www... außerhalb des Directory-Containers zu legen war die Lösung.
Warum ich nicht gleich DirectoryMatch genommen habe, vor allem weil die Daten auch wirklich im Unterverzeichnis liegen und ich nicht irgendwelche URL umschreibe, kann ich auch nicht mehr nachvollziehen.
Jetzt klappt es. Danke!

So ganz war ich mir nicht bewusst wie die Verarbeitungskette beim Apache intern abläuft. Da muss ich mich doch mal intensiv drum kümmern. :o

Was das Optimierungspotenzial anbelangt, hast du Recht.
Da habe ich einfach zu wenig dran gedacht, weil die Subdomain vor längerer Zeit nicht so wichtig war.
 
Einstellungen überschreiben sich in dieser Reihenfolge:
Code:
Globale Konfiguration
<VirtualHost>
<Directory[Match]>
.htaccess (Verhalten sich wie <Directory>)
<Files[Match]>
<Location[Match]>
Bei mehreren Matches von oben nach unten, so dass die letzen Anweisungen gelten. Zum Schluss .htaccess.

Außerdem muss man bei mod_rewrite beachten, dass es zweimal pro Anfrage ausgewertet wird. Einmal vor, und einmal nach der sonstigen Verarbeitung. Wenn du die Conditionals -f oder -d verwendest, brauchst du den <Directory>-Container. In allen anderen Fällen erspart man sich meistens viel Ärger, wenn man sie außerhalb einsetzt.
 
Last edited by a moderator:
Danke für deine Hinweise. Ich muss zugeben, ich wusste nicht genau wo sich LocationMatch einreiht, ich dachte, das greift früher; die Abfolge der restlichen Konfigurationsabschnitte war mir aber geläufig.

Ich meinte mit Verarbeitungskette die Abfolge der Request/Response und wo mod_rewrite sich einreiht. Hast du eine Idee wo sich Informationen dazu finden?
 
Es läuft wie gesagt zwei mal. Einmal ziemlich am Anfang, vor all diesen Abschnitten, und einmal nachdem der Request fast durch ist. Dabei werden beim ersten Mal die globalen Regeln, und beim zweiten Mal die verzeichnis-bezogenen Regeln angewendet.

Das Ganze ist hier genauer beschrieben: http://httpd.apache.org/docs/2.2/rewrite/tech.html

Ein paar weitere Hinweise zum Verständnis kann man noch dem Abschnitt über RewriteCond entnehmen: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond

Hoffe ich konnte helfen. :)

PS:
Ich betreibe mehrere Wikis, bei denen ich aus Gründen der URL-Ästhetik und Bequemlichkeit auf das Unterverzeichnis "/wiki/" verzichten wollte. Das ist in der Regel, nach Empfehlung von Wikimedia, ein Alias auf die index.php. Zuerst hatte ich deshalb solch ein Konstrukt eingesetzt:
Code:
<Directory /var/www/wiki>
	RewriteEngine on
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ /w/index.php [L]
</Directory>
Nur leider hat dann jeder Seitenaufruf einen Subrequest zur Folge. Also entschloss ich mich, das Ganze performanter zu gestalten. Der <Directory>-Container flog raus, und an die Stelle der Dateisystem-Abfrage setzte ich ein einfaches Suchmuster:
Code:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/(w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$)
RewriteRule ^.*$ /w/index.php [L]
Das funktioniert genau so gut, und schneller ist es auch. MediaWiki liegt unterhalb von "/w/", und die wenigen Dateien, die im Stammverzeichnis was verloren haben, kann man auch so noch angeben.
 
Last edited by a moderator:
Macht doch nichts. Durch deine Frage hast du mich dazu gebracht, mich selbst nochmal damit zu befassen. Das ist schon 'ne Weile her. Damals habe ich nicht alles verstanden, so dass ich bei mir jetzt auch noch was optimieren konnte. ;)
 
Back
Top