【问题标题】:Nginx rewrite first char hostNginx 重写第一个字符主机
【发布时间】:2014-11-18 06:25:54
【问题描述】:

htaccess 有一个规则:

RewriteCond %{HTTP_HOST} ^(([\w]{1})[\w.]+)$
RewriteRule ^root/(.*)$ site_link/%1/$1 [L]

需要转换成Nginx的规则。 而且我知道 IF 是邪恶的。

PS 非常感谢。

【问题讨论】:

  • 我的版本:` server_name j2 *.j2 "~^([\w]{1})+$";设置 $char_host $1;位置 /root/ { 重写 ^/root/(.*)$ /site_link/$char_host/$http_host/$1 break; } `
  • ([\w]{1}) 部分的意义何在?
  • XavierLucas,这里选择第一个字符域。

标签: mod-rewrite nginx host


【解决方案1】:

您的 HTTP 主机正则表达式不合适。

您正试图以某种方式在服务器端重新实现某些域名验证,而 DNS 不会以任何方式将损坏的域名格式解析为您的服务器 IP。

此外,如果您的正则表达式被使用,则会允许错误格式的“域名”进入:[\w.]+ 匹配 [a-zA-Z0-9_.]+,因此您将允许一系列已被 DNS 拒绝的格式。有关域名格式规范,请参阅 RFC 1123、2782 和 3696。

所以对于这一部分:放弃这个想法。现在,答案很简单,因为您不需要任何条件:

server {

    server_name my.domain.tld

    location / {
        rewrite ^/root/(.*)$ /site_link/$host/$1;
    }

}

【讨论】:

  • 非常感谢您的解释。但是您还没有解释如何获取域的第一个字母。
  • @Sofia 为什么要打扰?你甚至没有使用它:你的 %1 变量匹配整个正则表达式。所以这与$host 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2013-03-19
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多