强制www。除了一些目录通过htaccess所有网址

时间:2012-11-22 16:27:42

标签: .htaccess

在我的htaccess中,我使用此代码将所有非www请求重定向到www,除了一个www被剥离的目录和httpS(如果强制)。

RewriteCond $1 !^example1
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{REQUEST_URI} ^/example1/(.*) [NC]
RewriteRule ^(.*)$ https://example.com/example1/%1 [R=301,L]

我的问题是当我想添加更多例外,例如example2。我该怎么做呢?

此外,如果异常目录比www.example.com/dir/example3多一个级别,我该怎么办?

1 个答案:

答案 0 :(得分:0)

嗯,有两种选择:

  1. 您必须指定正则表达式而不是文字字符串,并且正则表达式必须匹配所有异常。

  2. 您使用重写地图。我建议你看看文档。


  3. 使用正则表达式:

    # some expections
    RewriteCond %{HTTPS} =off [NC]
    RewriteCond %{REQUEST_URI} ^/(example[0-9]+.*)$ [NC]
    RewriteRule ^(.*)$ https://example.com/%1 [R=301,L]
    
    # the default rule: => add "www."
    RewriteCond %{HTTP_HOST} !^www.example.com$ [NC] 
    RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
    

    我扭转了局面,在开始时有例外,在结尾处有一个'全部捕捉'。显然,你可以通过加倍第一行来添加更多例外。或者通过改变正则表达式。请注意,显然所需的正则表达式的详细信息取决于您拥有的异常集合。只有你知道......我建议你阅读优秀的manual


    您可以在条件块中使用逻辑运算符,而不是更复杂的正则表达式:

    # some expections
    RewriteCond %{HTTPS} =off [NC]
    RewriteCond %{REQUEST_URI} ^/(example1.*)$ [NC,OR]
    RewriteCond %{REQUEST_URI} ^/(example2.*)$ [NC]
    RewriteRule ^(.*)$ https://example.com/%1 [R=301,L]
    
    # the default rule: => add "www."
    RewriteCond %{HTTP_HOST} !^www.example.com$ [NC] 
    RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
    

    两个重要的在谈论重写时不能经常重复的事情:

    1. 阅读手册!它非常好,有精确的描述和很好的例子。

    2. 如果您可以访问主服务器配置,则使用REWRITE DEBUGGING: 重写模块为此定义了两个命令RewriteLogRewriteLogLevel。配置一些日志文件,级别可能为7.然后发出单个请求并监视日志文件中的新条目(使用tail -f /path/to/logfile)。这有助于理解重写引擎内部发生的事情以及意外事件开始发生的地方。