【问题标题】:.htaccess 301 redirect for all https to http EXCEPT ONE PAGE.htaccess 301 将所有 https 重定向到 http 除了一页
【发布时间】:2011-01-05 22:43:04
【问题描述】:

这是我目前在 .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)

我上面的代码有效,但是对于我需要是 https 的 1 页,它将 url 重写为 http。那一页必须是 https。

谢谢, 克里斯

【问题讨论】:

  • 感谢大家的意见!克里斯

标签: apache .htaccess url-rewriting rewrite


【解决方案1】:

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 中重新排序规则,但没有成功。如果有人找到更好的解决方案,将不胜感激。

【讨论】:

【解决方案2】:

除了威廉的出色解决方案之外,您还可以在 https rewriterule 之前的某处否定请求 uri

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

【讨论】:

  • 这确实是正确的解决方案。
【解决方案3】:

这是一篇不错的帖子,它似乎正确地重定向到 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,后面的正斜杠是可选的 我需要的是,如果 url 中没有类似产品的文本,那么它需要 http:// 如果 uri 中有字符串 products 那么它应该是 https://

如何做到这一点... 当我尝试时它会进入一个循环......重定向循环。

我正在使用 codeigniter 框架,我已经从 url 中删除了 index.php。

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

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

【讨论】:

    【解决方案4】:
    # 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]
    

    我还没有测试过,但是类似的东西应该可以工作

    编辑:更新

    【讨论】:

    • 这仍然允许所有其他页面为 https(而不是将它们重写为 http)。这不是将example.com/payments.php 重写为example.com/payments.php 第一个重定向仍然有效。我明白你的意思了......它看起来是正确的......它只是不工作。还有其他想法吗?谢谢,克里斯
    • 我已经稍微调整了您的代码。但是,一个问题是它需要同时接受 example.com 和 www.example.com 证书。
    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多