.htaccess 301将所有https重定向到http除了一页

时间:2010-01-16 21:48:49

标签: apache .htaccess url-rewriting rewrite

以下是我目前在.htaccess文件中的代码:

Options +FollowSymLinks 
RewriteEngine on
RewriteBase / 
RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我知道关于重写的杰克......而且关于这个主题的所有其他帖子都不符合我的标准,我对该语言的了解还不足以尝试解读它。

基本上我需要的是:

  1. 将“example.com”的所有实例重定向到“www.example.com”
  2. 将“ https // www.example.com”的所有实例重定向到“ http ://www.example.com”,但1页 !!!! (如果重要,该页面的文件名是payments.php)
  3. 我上面的代码有效,但对于我需要https的1页,它会将url重写为http。那一页必须是https。

    谢谢, 克里斯

4 个答案:

答案 0 :(得分:10)

  

Apache / 2.2.6(Win32)mod_ssl / 2.2.8 OpenSSL / 0.9.8g PHP / 5.2.6

我在本地测试过,所有用例似乎都运行良好。如果您还有其他问题,请随时提出。

# Rewrite Rules for example.com
RewriteEngine On
RewriteBase /

# Redirect from example.com to www.example.com
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Turn SSL on for payments
RewriteCond %{HTTPS} off
RewriteCond %{SCRIPT_FILENAME} \/payments\.php [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Turn SSL off everything but payments
RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} !\/payments\.php [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

重要!当用户使用 www 从任何 https 页面导航到任何 https 页面时没有 www ,他被要求接受您的非www域名的安全证书。

例如(YES =请求接受证书,NO - 相反):

1) https://www.asdf.com/payments.php - YES (www.asdf.com)
2) http://www.asdf.com/phpinfo.php - NO
3) https://asdf.com/phpinfo.php - YES (asdf.com)
4) https://www.asdf.com/phpinfo.php - NO

我试图重新排序.htaccess中的规则但没有成功。如果有人找到更好的解决方案,我们将非常感激。

答案 1 :(得分:5)

除了威廉的伟大解决方案,你可以在https rewriterule之前否定请求uri

RewriteCond %{REQUEST_URI} !^/?payments\.php

答案 2 :(得分:0)

这是一个不错的帖子,它似乎正确地重定向到http,但我想要一些像下面这样的东西

RewriteCond %{HTTP_HOST} ^site\.com
RewriteRule (.*) http://www.site.com/$1 [R=301,L]

#RewriteCond %{SERVER_PORT} !^443$
#RewriteRule ^products https://www.site.com/products/ [R=301,L]

# Disable SSL on pages other than payments.php
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^products
RewriteRule ^(.*)$ http://www.site.com/$1 [R=301,L]

# Require SSL on payments.php
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} ^products\/?$
RewriteRule ^(.*)$ https://www.site.com/$1 [R=301,L]


RewriteCond $1 !^(index\.php|images|js|css|static|img|payment|robots\.txt|blank.gif)
RewriteRule ^(.*)$ index.php/$1 [L]

我的网址是http://www.sitename.com,前面的正斜杠是可选的 我需要的是如果在网址中没有像产品这样的文字那么它需要他http:// 如果uri中有字符串产品,那么它应该是https://

怎么做... 当我尝试它时会进行循环...重定向循环。

我正在使用codeigniter框架工作,我已从网址中删除了index.php。

所以,如果http://sitename.com/products之类的内容发生,那么我希望它是https://sitename.com/products

如果网址中没有产品,那么它应该重定向到http://

答案 3 :(得分:-1)

# Rewrite Rules for example.com
RewriteEngine On
RewriteBase /

# Redirect from example.com to www.example.com
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# Disable SSL on pages other than payments.php
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^payments\.php$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# Require SSL on payments.php
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} ^payments\.php$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

我没有测试过,但是那样的东西应该可以运行

修改已更新