5

私はnginxに非常に慣れていないので、説明がずれている場合はご容赦ください。私が達成しようとしていることを説明するために最善を尽くします。

WordPress と nginx を使用して、ユーザー アカウントをメイン ドメインのサブドメインにマッピングしたいと考えています。たとえば、ユーザーが「sample」というアカウントを作成した場合、そのユーザーのサブドメインはsample.example.com.

ユーザーが に移動するsample.example.comと、サブドメインは にマッピングされexample.com/sample/ます。同様に、ユーザーがにアクセスした場合はsample.example.com/account/、 などにマップする必要がありますexample.com/sample/account/example.com/sample/URL は、このタイプの構造を書き直したものであることに注意してくださいexample.com/index.php?user=sample

cdn や admin など、リダイレクトしてはならない予約済みのサブドメインもいくつかあります。要求された場合、これらのルールでは無視する必要があります。

ユーザーがアカウントを作成するときに、これを自動的に達成するにはどうすればよいですか? ここでの目標は自動化です。一度正しくセットアップすれば、心配する必要はありません。私は文字通り、数日前に nginx を使い始めたばかりなので、どこから始めればよいかわかりません。私を正しい方向に動かすためのアドバイスは、非常に役に立ちます。ドメインの現在の構成ファイルは次のとおりです。

server {
    listen          80;
    server_name     www.example.com;
    rewrite     ^(.*) $scheme://example.com$1 permanent;
}

server {
    listen          443 ssl;
    server_name     www.example.com;
    rewrite         ^(.*) $scheme://example.com$1 permanent;
}

server {
    listen      80;
    server_name example.com;

    access_log  /var/www/example.com/logs/access.log;
    error_log   /var/www/example.com/logs/error.log;

    root        /var/www/example.com/public;
    index       index.php;

    location / {
        try_files $uri $uri/ @wordpress /index.php?q=$request_uri;
    }

    location @wordpress {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/public/index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME /index.php;
    }

    # Pass the PHP scripts to FastCGI server listening on UNIX sockets.
    #
    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com/public$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen                      443 ssl;
    ssl                         on;
    keepalive_timeout           70;
    server_name                 example.com;
    ssl_certificate             ssl/example.com.chained.crt;
    ssl_certificate_key         ssl/example.key;
    ssl_protocols               SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 HIGH:!aNULL:!MD5;
    ssl_session_cache           shared:SSL:10m;
    ssl_session_timeout         10m;
    ssl_prefer_server_ciphers   on;

    root        /var/www/example.com/public;
    index       index.php;

    location / {
        try_files $uri $uri/ @wordpress /index.php?q=$request_uri;
    }

    location @wordpress {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/public/index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME /index.php;
    }

    # Pass the PHP scripts to FastCGI server listening on UNIX sockets.
    #
    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com/public$fastcgi_script_name;
        include        fastcgi_params;
    }
}

私が達成しようとしていることは/etc/nginx/nginx.conf、自動化したい場合はおそらくファイルに入れる必要があることを理解しており、これを達成する方法を積極的に学ぼうとしています. 私は今いる場所で立ち往生しており、正しい方向に向けるアドバイス/ヘルプを探しています. 私は学びたいです!

4

3 に答える 3

5

答え

検索、微調整、構成に何日も費やした後、私の例とまったく同じように、サブドメインを URL にマップするために必要なコードを見つけました。example.com の vhost は次のとおりです: https://gist.github.com/thomasgriffin/4733283

server {
    listen      80;
    listen      443 ssl;
    server_name ~^(?<user>[a-zA-Z0-9-]+)\.example\.com$;

    location / {
        resolver            8.8.8.8;
        rewrite             ^([^.]*[^/])$ $1/ permanent;
        proxy_pass_header   Set-Cookie;
        proxy_pass          $scheme://example.com/user/$user$request_uri;
    }
}

server {
    listen          80;
    listen          443 ssl;
    server_name     www.example.com;
    return          301 $scheme://example.com$request_uri;
}

server {
    listen      80;
    server_name example.com;

    access_log  /var/www/example.com/logs/access.log;
    error_log   /var/www/example.com/logs/error.log;

    root        /var/www/example.com/public;
    index       index.php;

    location / {
        try_files $uri $uri/ @wordpress /index.php?q=$request_uri;
    }

    location @wordpress {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME /index.php;
    }

    # Pass the PHP scripts to FastCGI server listening on UNIX sockets.
    #
    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen                      443 ssl;
    ssl                         on;
    keepalive_timeout           70;
    server_name                 example.com;
    ssl_certificate             ssl/example.com.chained.crt;
    ssl_certificate_key         ssl/example.key;
    ssl_protocols               SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 HIGH:!aNULL:!MD5;
    ssl_session_cache           shared:SSL:10m;
    ssl_session_timeout         10m;
    ssl_prefer_server_ciphers   on;

    root        /var/www/example.com/public;
    index       index.php;

    location / {
        try_files $uri $uri/ @wordpress /index.php?q=$request_uri;
    }

    location @wordpress {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME /index.php;
    }

    # Pass the PHP scripts to FastCGI server listening on UNIX sockets.
    #
    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

マッピングのメイン チャンクは、最初のサーバー ブロックで行われます。私は任意のサブドメインをターゲットにしています (制限されたサブドメインは他の関連性のないコードで既に除外しています)、末尾にスラッシュがない URL に対する WordPress による内部リダイレクトを回避するために、末尾にスラッシュがあることを確認するように書き直しています。そこから、 でresolver定義された URL を解決するにはディレクティブが必要にproxy_passなるので、Google の DNS で解決しています。proxy_pass_headerまた、WordPress のログイン認証をそのまま維持するために、ディレクティブを使用して Cookie を送信しています。proxy_passマップ先の URL を定義します。

wp-config.phpまた、サブドメインでログイン認証を使用する場合は、カスタム cookie ドメインを次のように定義する必要があることにも注意してください。

define('COOKIE_DOMAIN', '.example.com');

そして、それはそれであるべきです。subdomain.example.comそのマップのような URL を、好きなように楽しむことができるようexample.com/user/subdomain/になりました。そこから、WordPress の Rewrite API を利用して、マップされた URL を特定のクエリ引数にマップし、$wp_queryカスタム テンプレートなどをロードするために送信できます。

于 2013-02-07T19:14:03.453 に答える
3

次のようにする必要があります。

server {
  listen 80; listen 443;
  server_name *.example.com;

  if ($host ~ "^(.*)\.example\.com$" ) { set $subdomain $1;}
  rewrite ^ $scheme://example.com/$subdomain/$request_uri permanent;
}

(余談ですが、正規表現^はすべてのURLに最も効率的に一致し、標準のnginx変数は引数を含むuriを保持するため、書き換え$request_uriにグループは必要ありません)(.*)

さらに、リダイレクトしたくないドメイン用に 2 つ目のサーバーブロックを追加します。

server {
  listen 80; listen 443;
  server_name cdn.example.com admin.example.com;
  # do whatever with the requests of the reserved subdomains;
}
于 2013-02-05T20:46:16.120 に答える