Apache 2からnginxに移行しましたが、サブドメインコントロールを手軽に処理するのに問題があります。私が欲しいもの:x.domain.tldが要求されたとき、内部的に domain.tld/xに書き換えます
私が抱えている問題は、nginxが常にブラウザにリダイレクトするように指示することでページをリダイレクトすることです。しかし、私が本当に望んでいるのは、Apache 2のように、これを内部で行うことです。また、x.domain.tldのみをリクエストすると、nginxは404を返します。これは、x.domain.tld /index.phpを実行した場合にのみ機能します。
これが私の設定です:
server {
listen 80 default;
server_name _ domain.tld www.domain.tld ~^(?<sub>.+)\.domain\.tld$;
root /home/domain/docs/;
if ($sub) {
rewrite (.*) /$sub;
}
# HIDDEN FILES AND FOLDERS
rewrite ^(.*)\/\.(.*)$ @404 break;
location = @404 {
return 404;
}
# PHP
location ~ ^(.*)\.php$ {
if (!-f $request_filename) {
return 404;
}
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/etc/nginx/sockets/domain.socket;
}
}
ありがとう!
同じ問題の解決策を探しているときにGoogleでこのQ&Aを見つけたので、最終的に使用した解決策を投稿したいと思いました。
MTeckによる最初のサーバーブロックはかなり見栄えがしますが、サブドメインの部分では、次のようにすることができます。
server {
listen 80;
server_name "~^(?<sub>.+)\.domain\.tld$";
root /path/to/document/root/$sub;
location / { try_files $uri $uri/ /index.php; }
location ~ \.php {
include fastcgi_params;
fastcgi_pass unix:/etc/nginx/sockets/domain.socket;
}
}
これにより、root
構成ディレクティブがサブドメインに依存するようになります。
私は壁に頭を打ちつけるのに何時間も費やしました、そしてこれは私のために働くものです
server {
listen 80;
server_name ~^(?P<sub>.+)\.example\.com$; #<-- Note P before sub, it was critical for my nginx
root /var/www/$sub; #<-- most important line cause it defines $document_root for SCRIPT_FILENAME
location / {
index index.php index.html; #<-- try_files didn't work as well
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; #<-- probably you have another option here e.g. fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
}
http://wiki.nginx.org/IfIsEvil をご覧ください。あなたはこの設定ファイルでかなり間違ったことをしています。
server {
server_name domain.tld www.domain.tld;
location / {
try_files $uri /index.php;
}
location ~ \.php {
include fastcgi_params;
fastcgi_pass unix:/etc/nginx/sockets/domain.socket;
}
}
server {
server_name "~^(?<sub>.+)*\.(?<domain>.*)$";
return 301 $scheme://$domain/$sub$request_uri;
}
あなたが望むのがそれを内部に保つことであるならば、あなたはそれを書き直すことができないでしょう。定義上、クロスサイトリライトはブラウザに送り返す必要があります。リクエストをプロキシする必要があります。
server {
server_name "~^(?<sub>.+)*\.(?<domain>.*)$";
proxy_pass http://$domain/$sub$request_uri;
}
Nginxwikiを読む必要があります。これらすべてが詳細に説明されています。
これはwwwでも機能します。
server {
listen 80 default_server;
listen [::]:80 default_server;
index index.php index.html index.htm index.nginx-debian.html;
server_name ~^www\.(?P<sub>.+)\.domain\.com$ ~^(?P<sub>.+)\.domain\.com$;
root /var/www/html/$sub;
location / {
try_files $uri $uri/ /index.php?$args;
}
}