【问题标题】:.htaccess redirect to https except on one page.htaccess 重定向到 https,除了一页
【发布时间】:2015-10-12 19:51:11
【问题描述】:

我想用我的 .htaccess 完成以下事情:

  1. 非 www 到 www
  2. http 到 https 页面 /my/smaple/page 除外
  3. 如果文件名不是文件或目录,则执行 index.php

现在是这样的:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/my/sample/page
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

如果我尝试访问http://www.mydomain.tld/my/smaple/page,我会被重定向到https://www.mydomain.tld/index.php。其他一切都有效。我的 .htaccess 知识很低,所以请解释一下出了什么问题。

【问题讨论】:

  • 请求/my/sample/page是否会映射到文件或目录?
  • @Jon Li:/my/sample/page 只是一个在 php 运行时从框架创建的路由,所以它绝对不存在。我在这个页面上使用了一些外部资源(主要是图像),这就是我想使用 http 而不是 https 的原因。而且我不认为最后一条规则会导致这个问题,因为它只是到 index.php 的内部重定向。

标签: .htaccess mod-rewrite redirect


【解决方案1】:

问题是/my/sample/page 被最后一条规则捕获,然后重写引擎循环。这就是正在发生的事情:

  1. 请求发送至http://www.example.com/my/sample/page
  2. 第一个规则被跳过,%{HTTP_HOST} 以“www”开头。
  3. 第二条规则被跳过,%{REQUEST_URI}/my/sample/page 开头
  4. 应用第三条规则,请求不是针对现有文件名或目录。请求 URI 现在是 /index.php
  5. 重写引擎循环
  6. 第一个规则被跳过,%{HTTP_HOST} 仍然以“www”开头。
  7. 第二条规则已应用%{REQUEST_URI} 现在是“/index.php”,不是/my/sample/page,请求被标记为重定向到https://www.exmaple.com/index.php
  8. 重写引擎循环
  9. 请求被标记为重定向,因此通过处理管道发送。

尝试更改第二条规则:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/my/sample/page
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteCond %{THE_REQUEST} !/my/sample/page
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

这样,当重写引擎循环时,%{THE_REQUEST} 变量仍然是GET /my/sample/page,因此条件仍然失败。

【讨论】:

  • 谢谢,完美。你能解释一下吗:5。重写引擎循环。我没想到会因为 [L] 而出现循环?!
  • @nipec 重写引擎循环遍历所有规则,直到 URI 停止更改(或者如果存在特定标志,如重定向或禁止)。 L 标志仅在当前迭代中停止重写引擎。所以使用L,它会停止评估所有规则,但它仍然循环。
【解决方案2】:

我自己找到了解决方案。我像这样工作得很好。

    RewriteCond %{HTTPS} off
RewriteCond %{THE_REQUEST} !/websocket_8087_check/
RewriteCond %{THE_REQUEST} !/websocket_8087/
RewriteCond %{THE_REQUEST} !/websocket_8086_check/
RewriteCond %{THE_REQUEST} !/websocket/
RewriteCond %{THE_REQUEST} !/websocket_8085_check/
RewriteCond %{THE_REQUEST} !/websocket_8085/
RewriteCond %{THE_REQUEST} !/websocket_8084_check/
RewriteCond %{THE_REQUEST} !/websocket_8084/
RewriteCond %{THE_REQUEST} !/websocket_8083_check/
RewriteCond %{THE_REQUEST} !/websocket_8083/
RewriteCond %{THE_REQUEST} !/websocket_8082_check/
RewriteCond %{THE_REQUEST} !/websocket_8082/
RewriteCond %{THE_REQUEST} !/websocket_8081_check/
RewriteCond %{THE_REQUEST} !/websocket_8081/$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 1970-01-01
    • 2011-01-05
    • 2014-03-26
    • 2014-12-13
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多