2015-08-07 18 views
8

Tôi đang cố gắng đính kèm tên miền quảng cáo vào trang web của tôi đã có trên https và sau đó sử dụng url chuyển hướng để chuyển hướng đến một trang khác trong trang web. Ví dụ: về cơ bản, nếu trang web của tôi là https://example.com và có trang https://example.com/xyz/xyz/promo thì tôi muốn chuyển hướng trình duyệt khi nhập https://promo.example.com vào trang này. Tôi đã thiết lập tất cả các cài đặt tuyến đường AWS 53 có liên quan.Không thể chuyển hướng trang web https đến một url khác - khối máy chủ nginx

khối máy chủ nginx tôi có

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

    server { 
      server_name www.example.com; 
      return 301 https://example.com$request_uri; 
    } 

    server { 
     server_name example.com; 
     return 301 https://example.com$request_uri; 
    } 

    server { 
     server_name promo.example.com; 
     return 301 https://example.com/xyz/xyz/promo; 
    } 
ssl_certificate /..path/..; 
ssl_certificate_key //..path/..; 
ssl_dhparam /..path/...; 
ssl_trusted_certificate /..path/..; 

add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; 
ssl_prefer_server_ciphers on; 
ssl_ciphers .......; //hidden 
ssl_protocols TLSv1.2 TLSv1.1 TLSv1; 
ssl_session_cache shared:SSL:10m; 
ssl_session_timeout 10m; 
ssl_buffer_size 1400; 
spdy_headers_comp 0; 
ssl_stapling on; 
ssl_stapling_verify on; 
resolver 8.8.8.8 8.8.4.4 valid=86400; 
resolver_timeout 10; 

server { 
    listen 443 ssl spdy; 
    server_name example.com; 
    include /etc/nginx/helper.conf; 
    root /var/www/example/ ; 
    index index.php index.html; 
    charset utf-8; 

    location/{ 
      add_header "Access-Control-Allow-Origin" "*"; 
      try_files $uri $uri/ /index.php$is_args$args; 
    } 

    location ~ \.php$ { 
      fastcgi_split_path_info ^(.+\.php)(/.+)$; 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      include fastcgi_params; 
    } 

    location ~ /\.ht { 
      deny all; 
    } 
} 

hành vi hiện tại này:

Nó chuyển hướng một cách chính xác khi tôi gõ vào promo.example.com trực tiếp mà không cần https. Nhưng nếu tôi gõ vào https://promo.example.com nó chỉ cho thấy tôi example.com, với url là https://promo.example.com

hành vi dự kiến:

Nếu tôi gõ vào https://promo.example.com, cần chuyển hướng đến https://example.com/xyz/xyz/promo

tôi không thể đặt https://promo.example.com và sau đó chuyển hướng với các khối máy chủ, vì nginx ném lỗi.

Làm thế nào tôi có thể chuyển hướng https://promo.example.com đến https://example.com/xyz/xyz/promo

+0

Tôi tin rằng https sử dụng cổng 443, vì vậy bạn nên liste đến cổng 443 cho điều đó –

+0

thử thêm này: 'nghe 443 default_server ssl;' –

+0

Thật sự tôi có nghe '443 ssl spdy' trong khối khai máy chủ của tôi , về cơ bản họ không làm những điều tương tự? – Slartibartfast

Trả lời

5

Do sử dụng Strict-Vận tải-An ninh tiêu đề trình duyệt cung cấp 301 chuyển hướng tự động bằng cách riêng của mình để ngăn chặn máy chủ này đã không bao giờ được sử dụng:

server { 
    server_name promo.example.com; 
    return 301 https://example.com/xyz/xyz/promo; 
} 

Cảng chuyển hướng 80-> 443 xảy ra ngay cả trước khi trình duyệt kết nối đến máy chủ, vì vậy Nginx luôn phục vụ khối máy chủ mới nhất dựa trên cổng 443. Điều này sẽ giúp bạn:

server { 
    listen 443 ssl; 
    listen 80; 
    server_name promo.example.com; 
    return 301 https://example.com/xyz/xyz/promo; 
} 
3

Hãy thử điều này:

server { 
server_name promo.example.com; 
rewrite^https://example.com/xyz/xyz/promo permanent; 
+0

Vấn đề tương tự như trước đây – Slartibartfast

2

Mỗi Server có thể có một trường hợp duy nhất của https, mà trong trường hợp này là example.com, do đó khi https là được đặt trước bất kỳ url nào, không phân biệt url, người dùng được chuyển hướng đến example.com.

Để người dùng được chuyển hướng đến url dự định bằng https, bạn cần phải có cổng riêng hoặc IP riêng cho trang web đó.

2

Theo http://nginx.org/r/listen, mặc định cho chỉ thị nghe là listen *:80 | *:8000;.

Nếu không có chỉ thị thì hãy dùng *: 80 nếu nginx chạy với đặc quyền superuser hoặc *: 8000 nếu không.

Như vậy, các đoạn mã bạn đã cung cấp không ảnh hưởng đến kết nối https vì chúng không áp dụng cho cổng 443 trên ssl.

Bạn chưa cung cấp đoạn mã cấu hình ssl và chi tiết chứng chỉ, để chúng tôi cung cấp cho bạn câu trả lời hoàn chỉnh, nhưng khi đã hiểu ở trên, câu trả lời có khả năng sẽ tự hoàn thành.

Bạn có thể tham khảo http://nginx.org/en/docs/http/configuring_https_servers.html#single_http_https_server liên quan đến định cấu hình một máy chủ duy nhất để xử lý cả yêu cầu HTTP và HTTPS.

P.S.Nói chung, HTTPS không có kế hoạch độc đáo với tên miền phụ và trừ khi bạn trả thêm tiền, chứng chỉ của bạn có thể không bao gồm bất kỳ tên miền phụ nào, điều đó có nghĩa là nó sẽ dẫn đến cảnh báo trình duyệt nếu bạn hoặc người dùng của bạn cố gắng truy cập các trang web đó thông qua sơ đồ địa chỉ https://.

+0

Đã cập nhật câu hỏi, cảm ơn, tôi nhìn vào liên kết đó ngay bây giờ, nhưng có đúng là nếu tôi phải có https trên tên miền phụ, nó phải nằm trên một IP khác? – Slartibartfast

+0

@Slartibartfast, không, nó chỉ phải là một IP khác nếu bạn có một chứng chỉ khác cho nó. Nếu chứng chỉ hiện tại của bạn không bao gồm 'promo.example.com' (hoặc rõ ràng hoặc thông qua' * .example.com') và bạn quyết định mua một chứng chỉ riêng biệt cho tên miền phụ đó, thì, có, nó sẽ được khuyến khích để có thêm IP cho chứng chỉ bổ sung đó, để đảm bảo khả năng tương thích tổng thể với các máy khách cũ hơn một chút. – cnst

+0

Thats ok, cert của tôi bao gồm * .example.com, nhưng vẫn không thể nhận https: // ... promo.example.com để chuyển hướng (nó vẫn ở example.com nhưng với url đã thay đổi) và http: // .... chuyển hướng chính xác – Slartibartfast

1

có hai cách để làm việc xung quanh này:

  • Có chứng chỉ ký tự đại diện cho * .example.com, vì vậy tất cả tên miền phụ đều có thể chia sẻ cùng một chứng chỉ.

  • Chạy từng trang web SSL tại một địa chỉ IP khác. Bằng cách này, máy chủ web biết được chứng chỉ SSL nào có thể gửi cho trình duyệt. - bằng cách kiểm tra địa chỉ IP nhận được kết nối đến.

Các vấn đề liên quan