【问题标题】:Nginx Redirect hostname+locationNginx 重定向主机名+位置
【发布时间】:2019-01-28 11:00:45
【问题描述】:

我的 nginx 配置使用 server_name _;在单个服务器{} 块中处理所有域,并将它们全部定向到位于单个文件夹中的同一个代码库,其中包含一个 index.php,用于整理域路由。 (这就是 Web 框架在单个集群中处理 100 个域的方式 - 无法改变这一点)。

其中一个站点有 2 个域。每种语言一个,我们称它们为 example.com 和 example.net。该站点也有特定语言的子文件夹,我们称它们为:/com/ 和 /net/。

我需要创建一个重定向,以确保语言子文件夹仅加载到匹配的域中。

例如,有效请求:

example.com/com/

example.net/net/

任何其他请求都需要根据子文件夹重定向:

example.com/net/ -> example.net/net/

example.net/com/ -> example.com/com/

我不能用框架来做,因为文件夹包含所有静态文件,所以路由器永远不会加载。这可以在 nginx 配置中完成吗?

谢谢

更新,添加我的配置的简化版本:

server {
    listen 80 default_server;
    server_name _;

    root /my/app/root;
    index index.php index.html;

    location / {
      try_files $uri /index.php;
    }

    #PHP
    location ~ \.php$ {
      try_files $uri = 404;
      [fastcgi stuff]
    }



    location = /favicon.ico {
      access_log off;
      log_not_found off;
    }

    location = /apple-touch-icon.png {
      access_log off; log_not_found off;
    }

    location = /apple-touch-icon-precomposed.png {
      access_log off;
      log_not_found off;
    }
}

【问题讨论】:

  • server_name _; 通常用于阻止您机器上的任何其他主机名。它不应该用于生产。
  • 这是一个正在慢慢被替换的旧服务器/应用程序,所以不要太担心......我有兴趣知道原因吗?如果有更合适的方法来处理获取 100 个域,这些域可以每周更改到同一个代码文件夹中,而无需不断更改 nginx 配置文件。
  • 你可以试试ngx_http_perl_module

标签: redirect nginx


【解决方案1】:

我认为每个子文件夹需要 1 个位置块(但尚未测试):

location /com {
  proxy_pass http://upstream:8888/com;
  proxy_set_header Host example.com;
  proxy_pass_request_headers on;
}

location /net {
  proxy_pass http://upstream:8888/net;
  proxy_set_header Host example.net;
  proxy_pass_request_headers on;
}

【讨论】:

  • 感谢您的建议,我只是想了解它的作用并一直在阅读。我是否理解这只会代理它,而不是返回 301 重定向然后将用户转发到正确的 url/路径?
  • 我的印象是您使用 nginX 作为反向代理。如果您只是简单地进行 URL 重写 - 那么您仍然可以在位置块内使用重写,但它们再次将是每个子文件夹 1 个位置
  • 抱歉含糊不清,我使用 nginx 作为服务器,它指向同一服务器上的应用程序文件夹来提供文件。只要我保留 1 个服务器块,每个位置都有 1 个块不是问题。这个重定向的位置块会是什么样子?
  • 如果您用实际的nginx.conf 更新您的问题,这对我们俩来说都会更容易:)
  • 添加了我的 nginx 配置服务器块的简化版本
【解决方案2】:

解决了...

location /com/ {
  if ($host = 'www.example.net') {
    return 301 https://www.example.com$request_uri;
  }

  index index.html;
}

其他位置/域则相反

【讨论】:

  • 请不要在 location 块中使用 if 指令,因为 if is evil!
  • 阅读链接,但我没有看到针对此特定问题的上述解决方案的任何替代方案。如果您有建议,请接受建议。如果不是,那么对于将在适当时候被替换的旧服务器/应用程序,这对我来说是可以接受的。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多