htaccess mod_rewrite:防止index.php出现的规则顺序

时间:2015-02-12 16:19:47

标签: apache .htaccess mod-rewrite

我有三条.htaccess规则:

  1. 检查域名是否以www开头。它将它添加到主机名
  2. 检查是否在不使用https协议的情况下调用主机,并强制执行
  3. 最后手段规则,如果以上都不匹配,它将重定向到index.php / $ 0,其中$ 0是" /"之后匹配的任何内容。在网址中:
  4. 这是文件的样子:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* index.php/$0 [PT,L]
    

    所有内容都有效,但如果没有https且没有www,那么用户会被https://重定向到www.,但{{1}也出现了。

    e.g。

    index.php

    ......正被重定向到......

    http://domain.com/test 
    

    而不是......

    https://www.domain.com/index.php/test
    

    可能是什么问题?

    非常感谢, 维拉德

1 个答案:

答案 0 :(得分:0)

不确定为什么您使用index.php规则的直通... documentation州:

  

默认情况下,RewriteRule中的目标(或替换字符串)被假定为文件路径。使用[PT]标志会将其视为URI。也就是说,使用[PT]标志会导致RewriteRule的结果通过URL映射传回,因此基于位置的映射(例如Alias,Redirect或ScriptAlias)可能有机会生效。

由于您未使用AliasRedirectScriptAliasPT不适用于您的规则集。

RewriteRule ^ index.php [L]

或者,以下之一:

RewriteRule .* index.php [L]
RewriteRule (.*) index.php/$1 [L]