【问题标题】:Should I try to minimize .htaccess redirects? (+ bonus questions) [closed]我应该尽量减少 .htaccess 重定向吗? (+奖金问题)[关闭]
【发布时间】:2016-12-11 05:19:50
【问题描述】:

在我的 .htaccess 文件中,我在 3 种情况下重定向:

  1. HTTP 转 HTTPS
  2. 如果路径不是目录,则修剪尾部斜杠
  3. 如果有 www.在域之前

现在,问题是:.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. 重写条件是否总是正则表达式?我都看过了:

RewriteCond %{SERVER_PORT} ^80$

还有:

RewriteCond %{SERVER_PORT} 80

这第二个 RewriteCond 是不是错了?不会也抓到180、8080等端口吗?

【问题讨论】:

  • ".htaccess 重定向有多贵" --- 至少 1 个 RTT
  • @zerkms 这有什么要担心的吗?我对这个问题的意思是,究竟将要执行什么。是否会再次进行整个域查找?
  • "是否会再次进行整个域查找?" --- 你不能这么说。很可能没有,但没有标准可以保证你。顺便说一句,当我为性能优化而烦恼时,我个人遵循简单的规则:我不在乎任何我无法可靠测量的东西。那么,请回答自己,您可以可靠地衡量问题中解决的哪些问题?
  • @zerkms 嗯,有趣的策略,但我个人不同意。如果我不知道某事是否会造成麻烦,但我认为它可能会造成麻烦,我会防范它。
  • @RoboRobok 1. 性能优化一门火箭科学。 2. 没有人可以预测什么对你不起作用 3. 没有适合所有人的通用食谱 4. 除非你是 google-fb-amazon-size - 几乎所有东西都对你同样有用。 5. 当你变得足够大并且有任何“严重”的负担时——你就会有足够的信心进行研究,而不是在 SO 上提出模糊的问题

标签: php apache .htaccess redirect mod-rewrite


【解决方案1】:

.htaccess 重定向有多贵?

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

例如,如果我要剪掉 www.,我是否也应该尝试在同一规则中剪掉尾部斜杠?

这取决于你。如果可以并且您认为它仍然可以维护并且您仍然认为值得节省 1 RTT - 去吧。否则 - 不要。

这会让我的 .htaccess 变得更复杂一些,但这值得吗?

对此没有绝对的衡量标准。 对你来说值得吗?

为什么在线教程总是将 ^(.*)$ 作为“整个路径”模式的示例,即使他们没有在规则中使用它?不简单。够快吗?

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

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

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

这第二个 RewriteCond 是不是错了?不会也抓到180、8080等端口吗?

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 2012-06-17
      • 2013-10-14
      • 2021-04-04
      • 1970-01-01
      • 2016-12-23
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多