我想强制Apache以下列形式对特定网址使用HTTPS:
https://www.example.com/signup/*
所以
如果有人直接转到以下任何示例网址,Apache会将网址转发到HTTPS等效网站。
e.g。
http://www.example.com/signup --> https://www.example.com/signup
http://www.example.com/signup/basic+plan --> https://www.example.com/signup/basic+plan
http://www.example.com/signup/premium --> https://www.example.com/signup/premium
任何人都知道怎么做?
提前致谢
答案 0 :(得分:5)
感谢Murat,
你几乎工作但是想出了如何让它完全正常工作。
以下是有效的:
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} ^/somefolder/?
RewriteRule ^(.*)$ https://www.domain.com/$1 [R,L]
请注意,我没有在www.domain.com rewriterule中包含某些文件夹
答案 1 :(得分:4)
我认为这就是我用过的东西:
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} ^/somefolder/?
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]
(来自here)
答案 2 :(得分:3)
您可以使用Redirect指令:
Redirect 301 /signup https://www.example.com/signup
这将自动保留URL中的/注册后的任何内容。请确保仅在非SSL站点上配置此指令,否则它可能会进入递归循环!
答案 3 :(得分:1)
您应该查看mod_rewrite文档
答案 4 :(得分:1)
我使用以下内容要求网站的结帐部分要求SSL:
<Directory "/var/www/html">
RewriteEngine on
Options +FollowSymLinks
Order allow,deny
Allow from all
RewriteCond %{SERVER_PORT} !^443$
RewriteRule \.(gif|jpg|jpeg|jpe|png|css|js)$ - [S=1]
RewriteRule ^checkout(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Directory>
例如,点击http://www.example.com/checkout重定向到https://www.example.com/checkout
该规则将跳过通常包含在页面中的文件扩展名,这样您就不会收到混合内容警告。您应该根据需要添加到此列表中。
如果您想要多个页面,请将RewriteRule更改为:
RewriteRule ^(checkout|login)(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
当然,该目录应与服务器上的实际路径匹配。此页面还可以为您的特定需求提供更多信息:http://www.whoopis.com/howtos/apache-rewrite.html
我在运行Plesk 8.6的网站上使用它,但这无关紧要。这是在我的vhost.conf文件中,就像把它放在你的httpd.conf文件中一样。我不确定你是否需要调整任何东西才能在.htaccess文件中使用它,但我对此表示怀疑。如果添加到conf文件,请不要忘记重新启动apache以重新加载配置。
如果您像我一样并且只想在特定页面上使用SSL,那么您还需要一个重写规则,将其发送回常规http。您可以使用以下内容进行反向效果:
RewriteCond %{SERVER_PORT} ^443$
RewriteRule \.(gif|jpg|jpeg|jpe|png|css|js)$ - [S=1]
RewriteRule !^(checkout|login)(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [L,R]
如果您正在使用Plesk,请记住,所有非SSL流量都使用vhost.conf文件,但所有SSL流量都使用vhost_ssl.conf文件。这意味着您需要SSL的第一个重写规则将放在vhost.conf文件中,但强制返回非SSL的第二个规则必须放在vhost_ssl文件中。如果您使用的是httpd.conf或.htaccess,我认为您可以将它们放在同一个地方。
我也在我的博客上发布了这个教程:Apache rewrite rules to force secure/non-secure pages。
答案 5 :(得分:0)
您可以使用mod_rewrite -
执行此操作RewriteCond%{SERVER_PORT}!^ 443 $
RewriteRule ^ / signup https://example.com/signup
RewriteRule ^ / signup /(.*)$ https://example.com/signup/ $ 1
应该可行,但我还没有测试过。
- 编辑 -
更正,我刚在我的一台服务器上试过这个,它对我来说很好用。您可能需要重新检查mod_rewrite配置。此外,如果您使用.htaccess,则需要确保该目录允许覆盖。
作为旁注,这假设您的SSL流量通过端口443。如果不是,则需要相应地调整重写条件。
答案 6 :(得分:0)
.htaccess文件通常放在带有选项-FollowSymLinks的范围内,该范围可阻止重写规则。这通常是安全规则。
因此经常需要这样的琐碎事情:
<If "%{HTTPS} != 'on'">
Redirect 301 /your/path https://www.example.com/your/path
</If>
这是对Greg Hewgill答案的一个小增强。