2012-02-10 34 views
12

Tôi đã di chuyển từ Apache 2 sang nginx và tôi gặp sự cố khi kiểm soát miền phụ của mình. Những gì tôi muốn: Khi x.domain.tld được yêu cầu, nội viết lại để domain.tld/xcấu hình máy chủ nginx: tên miền phụ vào thư mục

Vấn đề tôi nhận được là nginx luôn chuyển hướng trang bằng cách nói với các trình duyệt để chuyển hướng đến. Nhưng những gì tôi thực sự muốn là làm điều này trong nội bộ, như Apache 2 đã làm. Ngoài ra, nếu tôi chỉ yêu cầu x.domain.tld, nginx trả về một 404. Nó chỉ hoạt động khi tôi làm x.domain.tld/index.php

Dưới đây là cấu hình của tôi:

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; 
     } 
} 

Cảm ơn!

Trả lời

0

Bạn nên xem http://wiki.nginx.org/IfIsEvil. Bạn đang làm rất nhiều sai trong tập tin cấu hình này.

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; 
} 

Nếu bạn muốn giữ nội dung đó, bạn sẽ không thể viết lại nội dung đó. Theo định nghĩa, việc viết lại trang web chéo cần được gửi lại cho trình duyệt. Bạn sẽ phải ủy quyền yêu cầu.

server { 
    server_name "~^(?<sub>.+)*\.(?<domain>.*)$"; 
    proxy_pass http://$domain/$sub$request_uri; 
} 

Bạn nên đọc wiki Nginx. Tất cả điều này được giải thích sâu.

+0

cố gắng để khởi động lại nginx với ví dụ của bạn gây ra lỗi 'thất bại: nhân vật không được công nhận sau (< ' – vladkras

+0

tôi phải đề cập đến nó là nginx 1.10.1 – vladkras

6

Khi tôi tìm thấy Q & A này trên Google trong khi tìm kiếm giải pháp cho cùng một vấn đề, tôi muốn đăng giải pháp cuối cùng tôi đã sử dụng.


Khối máy chủ đầu tiên của MTeck trông khá đẹp, nhưng đối với các tên miền phụ một phần bạn chỉ có thể làm như sau:

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; 
    } 
} 

Điều này làm cho các chỉ thị root cấu hình phụ thuộc vào tên miền phụ.

+0

giải pháp này doesnt làm việc cho tôi – fdrv

2

Tôi ngồi hàng giờ liền đập đầu tôi vào tường và đây là những gì làm việc cho tôi

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; 
    } 
} 
+0

Nó làm việc cho tôi nữa sao?. Bạn có biết làm thế nào tôi có thể thêm hỗ trợ cho www, một số ngoại lệ? Ngay bây giờ khi cố gắng sử dụng www.mydomain.com nó cố gắng thử sử dụng tên miền phụ – fdrv

+0

Cũng có vẻ như nó sẽ không hoạt động với wordpress như wp yêu cầu/chỉ mục .php? $ args – fdrv

+0

@fdrv bạn phải đặt các quy tắc của riêng bạn trong phần 'location/{...}', ví dụ: 'rewrite^(. *?) $ /index.php?rt=$1 last;' works – vladkras

0

này sẽ làm việc cho www cũng có.

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; 
    } 
} 
Các vấn đề liên quan