我应该尽量减少.htaccess重定向吗? (+奖金问题)

时间:2016-08-04 22:17:10

标签: php apache .htaccess redirect mod-rewrite

在我的.htaccess文件中,我正在重定向3个案例:

  1. HTTP到HTTPS
  2. 如果路径不是目录,则修剪尾部斜杠
  3. 如果有www。在域之前
  4. 现在,问题是:.htaccess重定向有多贵?例如,如果我要删除www。,我是否还应该尝试在同一规则中修剪尾部斜杠?这会让我的.htaccess变得更复杂,但它值得吗?

    如果是,做这些事情的最佳.htaccess是什么?我目前的.htaccess如下:

    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
            Options -MultiViews
        </IfModule>
    
        RewriteEngine On
    
        # Remove www...
        RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
        RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
    
        # Redirect To HTTPS...
        RewriteCond %{SERVER_PORT} ^80$
        RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
    
        # Redirect Trailing Slashes If Not A Folder...
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/$ /$1 [L,R=301]
    
        # Handle Front Controller...
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
    </IfModule>
    

    现在承诺了奖金问题:

    1. 为什么在线教程总是将^(.*)$作为“整个路径”模式的示例,即使它们不在规则中使用它?是不是简单.足够快?
    2. 重写条件总是正则表达式吗?我见过两个:
    3. RewriteCond %{SERVER_PORT} ^80$

      RewriteCond %{SERVER_PORT} 80

      这第二次RewriteCond是不是错了?它不会捕获180,8080端口等吗?

2 个答案:

答案 0 :(得分:1)

  

.htaccess重定向有多贵?

服务器可以忽略不计。对于客户端,它是1个RTT(可能后跟更多,例如在HTTP的情况下 - > HTTPS)

  

例如,如果我要删除www。,我是否还应该尝试在同一规则中修剪尾部斜杠?

由你决定。如果你可以而且你认为它仍然可以保持它并且你仍然认为值得节省1 RTT - 去吧。否则 - 不要。

  

它会使我的.htaccess变得更复杂一点,但值得吗?

没有绝对的衡量标准。是否值得为你

  

为什么在线教程总是给^(。*)$作为&#34;整个路径&#34;的一个例子。模式,即使他们不在规则中使用它?不简单。足够快,快?

技术上^(.*)$匹配空字符串,.没有。因此,如果您没有捕获结果,.?的行为会相似。

  

重写条件是否总是正则表达式?

不。见http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

  

这第二次RewriteCond是不是错了?不知道它还能捕获180,8080个端口等吗?

如果您收听的端口不仅仅是80 - 那么它确实可能会导致误报。

答案 1 :(得分:1)

由于您希望用户始终通过HTTPS进行连接,因此我建议您添加Strict-Transport-Security标头。它告诉浏览器记住永远不要连接不安全的行:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

这告诉浏览器明年将请求透明地升级到TLS。