.htaccess重定向到https,但在一个页面上除外

时间:2015-10-12 19:51:11

标签: .htaccess mod-rewrite redirect

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

  1. 非www到www
  2. http到https,但页面/my/smaple/page
  3. 除外
  4. 如果文件名不是文件或目录,则执行index.php
  5. 这就是目前的情况:

    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知识很低,所以请解释一下我的错误。

2 个答案:

答案 0 :(得分:0)

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

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

    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,因此条件仍然失败。

答案 1 :(得分:0)

我自己找到了解决方案。我这样工作正常。

    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]