mod_rewrite具有外部重定向和内部重写

时间:2012-04-14 18:16:49

标签: mod-rewrite redirect ssl

我正在尝试使用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。

1 个答案:

答案 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]