【问题标题】:subdomain value in PHP (nginx)PHP(nginx)中的子域值
【发布时间】:2018-07-04 16:48:29
【问题描述】:

我有一个 Nginx 网络服务器(我是 Nginx 的新手)。这是我的 Nginx 配置文件:

server {
     listen 80;
     listen [::]:80;
     server_name example.com *.example.com;
     return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 5m;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name example.com *.example.com;

    location / {
            try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
             deny all;
    }

}

我有一个允许通配符子域的 DNS 记录集。我现在的问题是:如何在 PHP 中“捕获”当前子域?

例如:如果子域是http://demo.example.com,我想去 http://example.com?subdomain=demo.

提前致谢!

【问题讨论】:

    标签: php nginx subdomain


    【解决方案1】:

    主机标头已经包含客户端请求的域。你可以在 php 中获取它

    $domain = $_SERVER['HTTP_HOST'];

    但是,除非您拥有通配符 SSL 证书,否则您将度过一段糟糕的时光。

    SSL 协商发生在任何 HTTP 交换之前,因此如果子域和 SSL 证书不同意,则连接将失败。

    另外,将子域更改为查询字符串是个坏主意:

    • 您将无法单独配置每个子域 Nginx 并为每个客户端强制进行大量重定向和重写 连接。
    • 你的 SEO 会很糟糕。
    • 您的页面链接是什么样的?

    如果我有 one.example.com 而你有 two.example.com,请求将变为:

    example.com?subdomain=one example.com?subdomain=two

    这两个请求现在都由 example.com 上的同一索引页面处理。这真的是你想要的吗?

    【讨论】:

    • 是的,我有一个通配符 SSL 证书。我正在制作一个不同类别的网站。每个类别都有自己的子域:cat1.example.comcat2.example.com 等等。我希望能够只向数据库添加一个类别。所以我想要一个脚本来检查数据库中是否存在子域。如果您对此有更好的想法,请告诉我!
    • 将每个子域放在文件系统上自己的文件夹中。我个人建议你不要这样做,你只是在为自己工作。并对访问者的浏览体验产生负面影响。 example.com/one/example.com/two/ 击败 one.example.comtwo.example.com
    • 哦,好的。感谢您的意见!那我就用你的选项!
    • 如果您将所有内容都保存在同一个域中,那么在尝试共享 css 文件等资源时,您不会遇到 CORS 等问题,客户端浏览器将为您的所有页面缓存一次静态资产,页面在类别之间加载不需要新的 SSL 协商等,它只是更好的全面
    【解决方案2】:

    将以下服务器添加到您的 Nginx。不要忘记重启 Nginx 服务

    server {
      server_name  demo.example.com;
      rewrite ^(.*)  http://example.com?subdomain=demo;
    }
    

    更新

    根据评论,对于动态重定向,您应该通过正则表达式获取子域名

    server {
        listen       80;
        server_name  ~^(?<name>.+)\.example\.com$;
        return      301  http://example.com/?subdomain=$name;
    }
    

    另外,您可以重写它而不是通过

    进行 301 重定向
    rewrite ^(.*) http://example.com/?subdomain=$name;
    

    请参阅this document 了解更多信息。

    【讨论】:

    • 谢谢,但它必须是“动态的”。我的意思是:不确定它是“演示”,它可以是任何东西。
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多