2010-08-02 27 views
7

Tôi đang sử dụng UrlRewriteFilter để chuyển hướng đến SSL. Tôi đang chạy Glassfishv2.UrlRewriteFilter Trực tiếp đến https

Quy tắc của tôi trông giống như thế này ngay bây giờ. Đó là trong urlrewrite.xml của tôi trong WEB-INF của thư mục chiến tranh của tôi. Có thiết lập thủy tinh nào khác cần được thiết lập không?

<rule> 
     <condition name="host" operator="notequal">https://abc.def.com</condition> 
    <condition name="host" operator="notequal">^$</condition> 
    <from>^/(.*)</from> 
    <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to> 
    </rule> 

Nhưng FF tiếp tục nói rằng quy tắc chuyển hướng URL theo cách nó sẽ không bao giờ hoàn thành. Tôi không chắc chắn những gì đang xảy ra ở đây. bất kỳ ý tưởng?

Trả lời

11

Tôi nghi ngờ vấn đề là giá trị của tiêu đề host (mà bạn so sánh) không chứa lược đồ được sử dụng để truy cập tài nguyên, nơi mà giá trị so sánh của bạn thực hiện. Điều này có nghĩa là điều kiện luôn đúng, bởi vì máy chủ không bao giờ bằng với những gì bạn so sánh với, dẫn đến vòng lặp chuyển hướng vô hạn.

Nhìn vào tài liệu cho UrlRewriteFilter, bạn sẽ có thể làm điều gì đó như thế này để có được những gì bạn muốn:

<rule> 
    <condition type="scheme" operator="notequal">https</condition> 
    <condition name="host" operator="equal">abc.def.com</condition> 
    <from>^/(.*)</from> 
    <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to> 
</rule> 
+0

Cảm ơn rất nhiều, Tim & Vineet. Đề án thiếu từ quy tắc là vấn đề và bây giờ nó chuyển hướng chính xác. – adi

+0

sử dụng lược đồ cho loại trong điều kiện đầu tiên không hoạt động đối với tôi. Tôi đã sử dụng thay vào đó đã hoạt động: ^HTTPS $ ninjasense

0

Giá trị của hostname quy định tại các url viết lại quy tắc không thể bao gồm chương trình này. UrlRewriteFilter sử dụng nội bộ các phương thức API Servlet để xác định tên máy chủ, thông qua request.getServerName(); cuộc gọi phương thức này không bao giờ trả về lược đồ, vì vậy bạn nên thực hiện riêng việc xác thực lược đồ (như Tim đã ngụ ý).

Nếu bạn nhận thấy các phương pháp khác có sẵn, xác thực lược đồ phải được thực hiện riêng biệt, vì lược đồ chỉ có sẵn thông qua phương thức request.getScheme() trong API, được hiển thị riêng thông qua UrlRewriteFilter.

Lý do thực sự tại sao FF báo cáo lỗi trong chuyển hướng có thể là do nhiều 302 được gửi lại cho khách hàng, cho yêu cầu ban đầu (và các yêu cầu tiếp theo của khách hàng). Bạn có thể muốn theo dõi lưu lượng truy cập HTTP để xác định xem có quy tắc hiện diện khi chuyển hướng HTTPS không thành công hay không, về nguyên nhân thực sự của hành vi trong ứng dụng của bạn.

EDIT:

Nếu có thể, bạn có thể điều tra việc sử dụng các yếu tố transport guarantee MẬT trong web.xml để đảm bảo rằng các lực lượng container servlet tất cả các yêu cầu HTTP được thực hiện qua SSL.

0

Tôi không chắc chắn chính xác những gì là sai với ví dụ của bạn ở trên, nhưng đây là một trong những vấn đề đáng yêu có thể dễ dàng giải quyết bằng OCPsoft viết lại, một mã nguồn mở URLRewriteFilter:

@Override 
public Configuration getConfiguration(final ServletContext context) 
{ 

    return ConfigurationBuilder.begin() 
    .defineRule() 

    .when(Direction.isInbound() 
     .and(Domain.matches("abc.def.com")) 
     .and(Path.matches("/{path}").where("path").matches(".*")) 
     .andNot(Scheme.matches("https")) 
    .perform(Redirect.to("https://abc.def.com/{path}")); 

} 

Các Scheme đối tượng có sẵn dưới dạng phiên bản Rewrite 1.0.1: http://ocpsoft.org/rewrite/

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