2012-04-14 25 views
1

Ich versuche mod_rewrite zu verwenden, um bestimmte Seiten umzuleiten, um SSL zu verwenden. Dafür habe ich:mod_rewrite mit externem Redirect und internem Neuschreiben

RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/\..*$ 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC] 
RewriteRule ^(.+)\.php$ https://www.example.com/$1 [R=301,L] 

Dies funktioniert gut, und tut genau das, was ich will es tun.

Später in meinem .htacess Ich habe ein:

RewriteRule ^members/(.+)/change-password$ members/.change-password.php?item=$1 [NC,QSA,L] 

Wenn also eine URL angezeigt wird, wie zum Beispiel:

http://www.example.com/members/foo-bar/change-password 

Intern würde es als verarbeitet werden:

/members/.change-password.php?item=foo-bar 

Wieder funktioniert das gut und macht das, was ich will.

Was ich jetzt tun muss, ist dies in meine ursprüngliche SSL-Redirect-Logik zu integrieren, um sicherzustellen, dass alle Change-Passwort-Anfragen auf dieselbe URL, aber über https umgeleitet werden. Ich habe versucht:

RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/\..*$ 
RewriteCond %{REQUEST_URI} !^/members/.+/change-password [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/members/.+/change-password [NC] 
RewriteRule ^(.+)\.php$ https://www.example.com/$1 [R=301,L] 

Aber das funktioniert nicht - ich bekomme nur die Seite über http geliefert. Das Ändern der .+ zu .* scheint mich in eine permanente Umleitungsschleife zu setzen.

Ich vermute, das ist wegen der internen Neufassung, aber egal was ich versuche, ich kann nicht scheinen, es zu lösen.

Kann jemand bitte beraten?

Danke,

Adam M.

+0

Verlassen Sie sich nicht auf automatische Umleitungen, stellen Sie sicher, dass Ihre Links zu diesen Abschnitten 'https: //' verwenden. (Siehe [diese Antwort] (http://webmasters.stackexchange.com/a/28443/11628) und [diese Antwort] (http://stackoverflow.com/a/9105894/372643) für Details.) – Bruno

+0

@Bruno Danke für die Antwort aber Links im Frontend sind direkt auf https angegeben. Der Grund für die automatische Umleitung ist Gürtel und Hosenträger für diejenigen, die die URL selbst eingeben. Während ich '[F]' eine nicht https Anfrage für die URL, die nicht die Benutzererfahrung bieten würde, die ich suche (obwohl ich sicher bin, nicht jeder würde diesem Ansatz zustimmen). –

+0

Solange Sie nicht davon ausgehen, dass diese Weiterleitungen bei der Entwicklung Ihrer Anwendung vorhanden sind, macht Ihr Ansatz tatsächlich Sinn. – Bruno

Antwort

3

Eine weitere Überprüfung der mod_rewrite Dokumentation führte mich zu einem Bit ich in .htaccess-Dateien auf ihre Nutzung spezifische verpasst hatte. Grundsätzlich zeigt die [L] Flagge nicht wirklich den letzten gemäß der Norm an. Stattdessen müssen Sie das [END] Flag verwenden (http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l verweist).

Natürlich führte mich das dann zu einem anderen Problem - mein Hosting-Provider hat keine aktuelle Installation von Apache oder mod_rewrite, so dass die [END] Flag den Ubiqitous HTTP 500 Internal Server Error ausgelöst hat.

Was also zu tun? Nun ging ich zurück zu meiner ursprünglichen ruleset mit dem Wissen, dass [L] nicht das tat, was ich erwartet hatte, und entdeckte den Fehler sofort - der %{REQUEST_URI} Wert durch die interne Umschreiben aktualisiert worden war:

RewriteRule ^members/(.+)/change-password$ members/.change-password.php?url-slug=$1 [NC,QSA,L] 

Deshalb meine Original zu verändern Umleitung Logik auszuschließen diese gelöst mein Problem:

RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/\..*$ 
RewriteCond %{REQUEST_URI} !^/members/.+/change-password$ [NC] 

RewriteCond %{REQUEST_URI} !^/members/\.change-password(\.php)? [NC]

RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/members/.+/change-password$ [NC] 
RewriteRule ^(.+)(\.php)?$ https://www.example.com/$1 [R=301,L] 
Verwandte Themen