动态URL的SSL重定向

时间:2011-08-31 21:45:12

标签: .htaccess

我大吃一惊!我一直在尝试通过.htaccess将两个特定页面重定向到HTTPS,并强制所有其他页面始终使用HTTP。其中一个URL是动态的,这就是我的问题所在。没有我发现的例子对我有用。以下是我目前的代码。我终于确实得到了部分工作,所以它只是关闭我需要帮助的SSL。应该使用SSL的唯一网页是login.phpregister.php?country=xx,其中xx会有所不同,并且始终是小写字母。

Options +FollowSymLinks
RewriteEngine on

# Turn on ssl for specific pages
RewriteCond %{HTTPS} off
RewriteRule ^login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{QUERY_STRING} ^country=([a-z]+)$
RewriteRule ^register.php https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Turn off ssl when not accessing specific pages
RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} !\/register.php\?country=([a-z]+)$ [NC]
RewriteCond %{SCRIPT_FILENAME} !\/login.php$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Redirect non-canonical hostname requests, preserving http/https
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{SERVER_PORT}>s ^(443>(s)|[0-9]+>s)$
RewriteRule ^(.*)$ http%2://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

1 个答案:

答案 0 :(得分:1)

你真的不需要检查country=xx是什么 - 它是一个查询字符串参数,并不重要。重定向到HTTPS应该基于每页,而不是每个查询字符串参数。

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

# force https for /login.php and /register.php
RewriteCond %{HTTPS} =off
RewriteRule ^(login|register)\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# don't do anything for images/css/js (leave protocol as is)
RewriteRule \.(gif|jpe?g|png|css|js)$ - [NC,L]

# force http for all other URLs
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/(login|register)\.php$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# your other rewrite rules below
  1. 在任何其他重写规则(如果有的话)之前,这些规则需要放在网站根文件夹中的.htaccess中。如果放在其他地方,可能需要进行一些小的调整。

  2. 他们会

    • 强制/login.php/register.php
    • 的HTTPS
    • 对图像,CSS样式和JavaScript文件(具体而言,对于具有这些扩展名的文件)不执行任何操作
    • 并将强制HTTP用于所有其他网址
  3. 您可以轻松地将其他网址添加到该列表中 - 只需通过向列表中添加其他文件名来编辑现有规则(2个位置中的相同文本:1)以强制2)排除)

  4. 文件名区分大小写。因此,如果请求/LOGIN.php,这些规则将不起作用(Apache也不会提供服务,因为Linux是区分大小写的操作系统..所以这里不必担心太多。)

  5. 明显的事情:应该启用mod_rewrite并且.htaccess文件需要由Apache处理(一些网站托管公司因性能和安全原因而禁用它们)。

  6. 重要提示: 这些规则很可能不会立即为您服务。这是因为现代浏览器会根据您之前的尝试重定向CACHE 301。因此,我建议在另一个浏览器上测试它,并在测试期间更改301到302(302未缓存)..或清除所有浏览器缓存(甚至可能是历史记录)并重新启动浏览器。


    <强>顺便说一句:

    1. 无需在%{SCRIPT_FILENAME} !\/login.php$

    2. 中转义斜杠
    3. %{SCRIPT_FILENAME}只匹配文件名,绝对不是查询字符串,因此!\/register.php\?country=([a-z]+)$根本没有意义。