3

できることはすべて試しましたが、うまくいきません。

サブドメインを NGinx を使用して Debian サーバーの特定のフォルダーにリダイレクトしたいのですが、試した構成は次のとおりです。

server {
    listen 8080;
    server_name  ~^(?<user>.+)\.example\.net$;
    root /srv/www/example.net/$user;
}

=> エラーは:

nginx の起動: [emerg]: 不明な「ユーザー」変数構成ファイル /etc/nginx/nginx.conf テストに失敗しました

(注:ここに示されているように、^なしでも試しました:Nginx server_name regexp not working as variable

代わりにこれを試してみると:

server {
    listen 8080;
    server_name  *.example.net$;
    root /srv/www/example.net/$1;
}

リクエストにエラーがあります:

2013/08/20 15:38:42 [エラー] 5456#0: *6 "/srv/www/example.net//" のディレクトリ インデックスは禁止されています。クライアント: xxx.xxx.xxx.xxx、サーバー: * .example.net、リクエスト: "GET / HTTP/1.1"、ホスト: "test.example.net:8080"

別名、$1 は空です !

ドキュメントは間違っています: http://nginx.org/en/docs/http/server_names.html

アップデート:

これは機能しています ( https://serverfault.com/questions/457196/dynamic-nginx-domain-root-path-based-on-hostnameから取得):

server {
    server_name ~^(.+)\.example\.com$;
    root    /var/www/example.com/$1/;
}

しかし、PHP ページを表示したいのですが、サーバー {} に以下を追加すると、$1 は空になります (wtf?) :

  index index.php index.html;
  location = /favicon.ico {
    log_not_found off;
    access_log off;
  }
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
  # Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
  location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
    deny all;
  }
  # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
  location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
  }
  location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
    expires max;
    log_not_found off;
  }
  location ~ \.php$ {
    server_tokens off;
    try_files $uri $uri/ /index.php?$args;

    fastcgi_pass   unix:/tmp/php5-fpm.sock;
    fastcgi_index  index.php;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;

    fastcgi_intercept_errors off;
    fastcgi_send_timeout 30s;
    fastcgi_read_timeout 30s;
  }
4

3 に答える 3

4

私はついに解決策を見つけましたが、それほどきれいではありません。

実際、これは古い NGinx バージョン (Debian Squeeze では 0.7.67) と NGinx 構成の奇妙な反応 (おそらくこのバージョンから) の混合でした。

次のコードは問題なく動作しますが、NGinx バージョン 1.2.1 でのみ成功します (0.7.67 では失敗し、他のバージョンではテストされていません)。

map $host $username {
  ~^(?P<user>.+)\.example\.com$ $user;
}

server {
  listen 80;
  server_name *.example.com;
  root /var/www/example.com/$username;

  index index.php index.html;
  location = /favicon.ico {
    log_not_found off;
    access_log off;
  }
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
  # Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
  location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
    deny all;
  }
  # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
  location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
  }
  location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
    expires max;
    log_not_found off;

  }
  location ~ \.php$ {
    server_tokens off;
    try_files $uri $uri/ /index.php?$args;

    fastcgi_pass   unix:/tmp/php5-fpm.sock;
    fastcgi_index  index.php;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;

    fastcgi_intercept_errors off;
    fastcgi_send_timeout 30s;
    fastcgi_read_timeout 30s;
  }
}

この代替手段も機能します(新しい PCRE バージョンの場合):

map $host $username {
  ~^(?<user>.+)\.example\.com$ $user;
}
于 2013-08-21T13:47:26.680 に答える
3

見つかったすべてのソリューションを組み合わせて、独自の作業を作成する必要がありました。.confこれは、同様の質問からの私の 回答です

server {
    listen       80;
    server_name ~^(?P<sub>.+)\.example\.com$;
    root /var/www/$sub;

    location / {
        index index.php index.html;
    }
}
于 2016-10-18T16:36:11.990 に答える