2010-07-01 28 views
48

Tôi muốn có một kiểm tra trong javascript của tôi nếu trang tải lên là trên máy địa phương của tôi.Cách kiểm tra bằng javascript nếu kết nối là máy chủ cục bộ?

Lý do tại sao tôi muốn làm điều đó là khi tôi phát triển tôi muốn đảm bảo rằng cả hai xác thực phía máy chủ (C#) của tôi đang hoạt động chính xác. Vì vậy, tôi muốn thấy cả lỗi phía máy khách và phía máy chủ sẽ hiển thị.

Vì vậy, trong khi tôi đang thử nghiệm, tôi có một lá cờ trong công cụ xác thực jquery của tôi mà luôn luôn cho phép dữ liệu không hợp lệ đi qua. Bằng cách này, tôi thấy lỗi máy khách và máy chủ tại một thời điểm.

Tuy nhiên ngay bây giờ tôi phải tự di chuyển và thay đổi qua lại khi chuyển từ phát triển sang sản xuất.

Trả lời

101

Biến số location.hostname cung cấp cho bạn máy chủ lưu trữ hiện tại. Đó nên là đủ để bạn có thể xác định môi trường bạn đang ở trong

if (location.hostname === "localhost" || location.hostname === "127.0.0.1") 
    alert("It's a local server!"); 
+10

không có phải là một tổng quát hơn "catch-all" giải pháp/điều đó cũng sẽ bao gồm các trường hợp sử dụng 127.0.0.1, vv? – iX3

+8

Đây chỉ là sai. nhiều người chỉnh sửa tệp lưu trữ của họ để từ 'localhost' sẽ không được tìm thấy – vsync

+4

tôi đồng ý. Cái này sai. Cũng sẽ không hoạt động khi truy cập tệp "cục bộ" thông qua ổ đĩa mạng. – ProblemsOfSumit

2

Bạn có thể phát hiện ở một trong mã của bạn đằng sau trang với C#, như thế này:.

if ((Request.Url.Host.ToLower() == "localhost")) 
{ 
    // ..., maybe set an asp:Literal value that's in the js 
} 

Hoặc nếu bạn muốn làm nó từ kịch bản lệnh, bạn có thể kiểm tra giá trị window.location.host.

if (window.location.host == "localhost") 
{ 
    // Do whatever 
} 

Hy vọng điều này sẽ hữu ích.

+3

location.host bao gồm tên máy chủ và cổng. Sử dụng location.hostname để thay thế. – pmont

0

Những câu trả lời ở trên chủ yếu là giải quyết vấn đề nhưng ...

  • gì nếu localhost không nhất thiết phải là 'localhost /'?
  • Nếu bạn muốn thực hiện xác thực FE trong quá trình phát triển thì sao?
  • gì nếu bạn muốn hành vi khác nhau trong dev
    (fe xác nhận, hãy xác nhận, không có xác nhận)

Một giải pháp là để thiết lập các hash vị trí và kiểm tra xem nó.

http://myname.foo.com/form.html#devValidation

Bạn có thể thêm tùy chọn không giới hạn với một công tắc

switch(location.hash) {} 
    case '#devValidation': 
     // log the results and post the form 
     break; 
    case '#beValidation': 
     // skip front end validation entirely 
     break; 
    case '#noValidation': 
     // skip all validation $('[name=validationType']).val('novalidation'); 
     break; 
    case '#feValidation': 
    default: 
     // do fe validation 
     break; 
} 
+0

Giải pháp này vẫn có một số công việc thủ công và nó có thể bị giả mạo. – A1rPun

+0

Tôi nghĩ rằng "công việc thủ công" là không đáng kể, giả mạo cũng vì chúng tôi có thể gửi bất cứ điều gì chúng tôi thích mà không có sự chấp thuận của javascript và hầu hết các khuôn khổ có bộ lọc giảm thiểu các cuộc tấn công trước khi yêu cầu đến ứng dụng. Có lẽ cho phép OP bỏ qua xác thực phía máy chủ là một rủi ro, nhưng nó chỉ được thêm vào để hiển thị tiện ích của việc sử dụng một khóa trong băm. – Shanimal

+0

Tôi không bao giờ sử dụng localhost hoặc loopback vì danh sách trắng của hàng chục khách hàng quốc tế (clinetA.com, clientA.de, clientB.com, clientB.au, v.v ...) sẽ nhanh chóng trở thành cơn ác mộng. Tôi quyết định cung cấp giải pháp này vì nó không quan tâm đến miền và có thể được kiểm tra trong một trang web trực tiếp mà không cần vá. – Shanimal

1

Một cách dễ dàng để làm điều này sẽ được chỉ cần kiểm tra tên máy chống localhost hoặc kiểm tra tên miền tùy chỉnh của bạn chống lại một chuỗi con, trong trường hợp này "url" .local, chẳng hạn như http://testsite.local

var myUrlPattern = '.local'; 
if (window.location.hostname === "localhost" || location.hostname === "127.0.0.1" || window.location.hostname.indexOf(myUrlPattern) >= 0) { 
    alert("It's a local server!"); 
} 
7

nếu khởi chạy html tĩnh trong trình duyệt, ví dụ như từ vị trí như file:///C:/Documents and Settings/Administrator/Desktop/ phát hiện "localhost" sẽ không hoạt động. location.hostname sẽ trả lại chuỗi trống. do đó

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "") 
    alert("It's a local server!"); 
+0

Tôi đã gặp vấn đề chính xác này và trong khi tôi tự tìm ra giải pháp, câu trả lời này vẫn sẽ cao hơn. – domsson

1

Vẫn chưa bắt kịp nhưng có thể là một chút cải thiện. Bây giờ bạn có thể tạo ra một loạt các lĩnh vực và sử dụng .includes

const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...]; 

if (LOCAL_DOMAINS.includes(window.location.hostname)) 
    alert("It's a local server!"); 
Các vấn đề liên quan