【问题标题】:Virtual host or simply rewrite?虚拟主机还是干脆改写?
【发布时间】:2018-02-25 00:35:06
【问题描述】:

我有一个包含个人资料页面的网站。显然,所有用户在此 url 上都有自己的个人资料页面:domain.dev/profile?user=%username%。

现在,我想让每个用户都可以在 username.domain.dev 上看到个人资料。

我看到很多类似 How to let PHP to create subdomain automatically for each user? 的帖子,但这并没有解决我的问题。

我的网站在 ubuntu (nginx) 和 Windows IIS 10 上。 我怎样才能做到这一点?您还有其他我可以看到的链接/问题吗?或者有什么建议?

【问题讨论】:

    标签: nginx virtualhost


    【解决方案1】:

    在 Nginx 中,你只需要设置类似这样的东西:

    server {
        listen       80;
        server_name  *.domain.dev;
        ...
    }
    

    注意:

    server_name  *.domain.dev;
    

    在您的应用程序中,您需要拆分/处理 HOST 标头。

    另一种方法,但这意味着 redirect 301 是做这样的事情:

    server {
       listen      80;
       server_name ~^(?<subdomain>\w+)\.your-domain\.tld$;
       return 301 https://domain.dev/profile?user=$subdomain;
    }
    

    在这种情况下,请注意 server_name 中的 regex

    server_name ~^(?<subdomain>\w+)\.your-domain\.tld$;
    

    这有助于您将子域用作$subdomain

    为了避免重定向,这可能有效:

    server {
      listen      80;
      server_name ~^(?<subdomain>\w+)\.your-domain\.tld$;
    
      location / {
        resolver 8.8.8.8;
        proxy_pass http://httpbin.org/get?user=$subdomain;
        proxy_set_header Host httpbin.org; 
      } 
    }
    

    出于测试目的,我使用http://httpbin.org/on theproxy_pass`,以便您可以使用以下内容进行测试:

    $ curl foo.your-domain.tld:8080
    {
      "args": {
        "user": "foo"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Connection": "close", 
        "Host": "httpbin.org", 
        "User-Agent": "curl/7.54.0"
      }, 
      "origin": "91.65.17.142", 
      "url": "http://httpbin.org/get?user=foo"
    }
    

    注意响应:

    "url": "http://httpbin.org/get?user=foo"
    

    在这种情况下匹配子域foo.your-domain.tld。

    【讨论】:

    • 是的,我做到了,但是当我转到 test.domain.dev 时,它会重定向到索引页面。我的问题是创建一个规则来重写用户配置文件。相反:test.domain.dev 不必显示索引,而是显示 domain.dev/profile?user=test 上的 test 用户配置文件
    • 只需添加另一个示例以将 test.domain.dev 发送到 domain.dev/profile?user=test,希望对您有所帮助
    • 有一种方法可以查看我在 test.domain.dev 中的 /profile?user=test 上看到的内容吗?没有重定向我的意思是
    • 我加了一个例子使用proxy_pass试试看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2012-03-16
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多