mod_rewrite z zewnętrznym przekierowaniem i wewnętrznym przepisem
Próbuję użyć mod_rewrite do przekierowania niektórych stron, aby używać SSL. Do tego mam:
<code>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] </code>
To działa dobrze i robi dokładnie to, co chcę.
Później w mojej .htacess mam:
<code>RewriteRule ^members/(.+)/change-password$ members/.change-password.php?item=$1 [NC,QSA,L] </code>
Więc jeśli URL pojawia się na przykład:
<code>http://www.example.com/members/foo-bar/change-password </code>
Wewnętrznie będzie przetwarzany jako:
<code>/members/.change-password.php?item=foo-bar </code>
Ponownie działa to dobrze i robi to, co chcę.
Teraz muszę to uwzględnić w mojej oryginalnej logice przekierowania SSL, aby upewnić się, że wszelkie żądania zmiany hasła są przekierowywane na ten sam adres URL, ale zamiast tego na https. Próbowałem:
<code>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] </code>
Ale to nie działa - po prostu dostaję stronę przez http. Zmienianie.+
do.*
wydaje się, że wprowadza mnie w stałą pętlę przekierowania.
Zgaduję, że to z powodu wewnętrznego przepisywania, ale bez względu na to, co spróbuję, nie mogę go rozwiązać.
Czy ktoś może doradzić?
Dzięki,
Adam M.