我正在尝试使用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传送页面。将.+
更改为.*
似乎会让我进入永久重定向循环。
我猜这是因为内部重写,但无论我尝试什么,我似乎无法解决它。
有人可以提供建议吗?
谢谢,
Adam M。
答案 0 :(得分:3)
对mod_rewrite文档的进一步审查让我有点误解了它在.htaccess文件中的用法。基本上[L]
标志实际上并不按照标准指示最后一个。相反,您需要使用[END]
标记(http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l引用)。
当然那引发了我另一个问题 - 我的托管服务提供商没有Apache或mod_rewrite的最新安装,因此[END]
标志触发了无处不在的HTTP 500内部服务器错误。 / p>
那该怎么办?好吧,我回到原来的规则集,知道[L]
没有做我期待的事情并立即发现错误 - %{REQUEST_URI}
值已被内部重写更新:
RewriteRule ^members/(.+)/change-password$ members/.change-password.php?url-slug=$1 [NC,QSA,L]
因此,更改原始重定向逻辑以排除此问题解决了我的问题:
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]