2015-04-28 24 views
9

Ok, vì vậy cho mục đích phát triển, chúng tôi có một máy chủ web chuyên dụng. Nó hiện không kết nối trực tiếp với internet, vì vậy tôi đã thiết lập một proxy ngược apache trên một máy chủ khác, mà chuyển tiếp đến máy chủ phát triển.Các tuyến Laravel đằng sau proxy ngược

Bằng cách này, tôi có thể truy cập web vào máy chủ.

Vấn đề là, các tuyến trong Laravel hiện đang được đặt trước bằng địa chỉ IP của máy chủ nội bộ hoặc tên máy tính của máy chủ.

Ví dụ, tôi đi đến http://subdomain.test.com nhưng tất cả các tuyến đường, tạo ra bằng cách sử dụng route() helper, đang hiển thị url sau: http://10.47.32.22 và không http://subdomain.test.com.

Các reverse proxy được thiết lập như vậy:

<VirtualHost *:80> 
    ServerName igateway.somedomain.com 

    ProxyRequests Off 
    <Proxy *> 
     Order deny,allow 
     Allow from all 
    </Proxy> 

    ProxyPass/http://10.47.32.22:80/ 
    ProxyPassReverse/http://10.47.32.22:80/ 
    <Location /> 
     Order allow,deny 
     Allow from all 
    </Location> 
</VirtualHost> 

tôi đã thiết lập tên miền thực trong config\app.php.

Câu hỏi

Làm thế nào tôi có thể thiết lập URL mặc định để sử dụng trong định tuyến? Tôi không muốn nó bằng cách sử dụng địa chỉ nội bộ, bởi vì điều đó đánh bại điểm của proxy ngược lại.

Tôi đã thử bao gồm tất cả tuyến đường của mình trong nhóm Route::group(['domain' ..., cũng không hoạt động.

Trả lời

11

Tôi chạy vào cùng một vấn đề (hoặc tương tự), khi một ứng dụng Laravel 5 không nhận thức được đằng sau một bộ cân bằng tải SSL.

Tôi có thiết kế như sau:

  • khách hàng đàm phán với một cân bằng tải SSL qua HTTPS
  • cuộc đàm phán cân bằng tải SSL đến một máy chủ back-end qua HTTP

đó, tuy nhiên, làm cho tất cả các URL trong mã HTML được tạo bằng lược đồ http: //.

Sau đây là một workaround quick'n'dirty để làm cho công việc này, bao gồm các lược đồ (http vs https):

Đặt đoạn mã sau vào đầu app/Http/tuyến đường.php

$proxy_url = getenv('PROXY_URL'); 
$proxy_schema = getenv('PROXY_SCHEMA'); 

if (!empty($proxy_url)) { 
    URL::forceRootUrl($proxy_url); 
} 

if (!empty($proxy_schema)) { 
    URL::forceSchema($proxy_schema); 
} 

sau đó thêm dòng sau vào .env file:

PROXY_URL = http://igateway.somedomain.com 

Nếu bạn cũng cần phải thay đổi lược đồ trong mã HTML được tạo ra từ http: // để https : //, chỉ cần thêm dòng sau:

PROXY_SCHEMA = https 
4

Ok, vậy tôi đã hiểu. Hy vọng rằng điều này sẽ giúp một người nào đó trong tương lai.

Nó có vẻ như Laravel bỏ qua url tài sản trong file config\app.php cho các yêu cầu http (nó ghi nó chỉ cho thợ thủ công), và nó thay vì sử dụng một trong hai HTTP_HOST hoặc SERVER_NAME cung cấp bởi apache để tạo ra miền với URL.

Để ghi đè url mặc định này, hãy vào tập tin routes.php bạn và sử dụng các phương pháp sau đây:

URL::forceRootUrl('http://subdomain.newurl.com'); 

này sau đó sẽ buộc các máy phát điện URL để sử dụng các url mới thay cho HTTP_HOST hoặc SERVER_NAME giá trị.

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