我正在尝试使用 mod_rewrite 重定向某些页面以使用 SSL。为此,我有:
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]
这很好用,并且完全符合我的要求。
后来在我的 .htacess 中,我有一个:
RewriteRule ^members/(.+)/change-password$ members/.change-password.php?item=$1 [NC,QSA,L]
因此,如果 URL 显示为,例如:
http://www.example.com/members/foo-bar/change-password
在内部它将被处理为:
/members/.change-password.php?item=foo-bar
同样,这很好用,并且也在做我想做的事。
我现在需要做的是将此包含在我原来的 SSL 重定向逻辑中,以确保任何更改密码请求都被重定向到相同的 URL,但改为通过 https。我试过了:
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]
但这不起作用 - 我只是通过 http 传递页面。更改.+
to.*
似乎让我进入了一个永久的重定向循环。
我猜这是因为内部重写,但无论我尝试什么,我似乎都无法解决它。
有人可以请教吗?
谢谢,
亚当 M。