নোড.জেএস এক্সপ্রেসে বর্তমান অনুরোধের হোস্টনাম পান


175

সুতরাং, আমি এখানে কিছু সাধারণ অনুপস্থিত হতে পারি, তবে হোস্ট-নেম পাওয়ার কোনও উপায় খুঁজে পাচ্ছি না যা অনুরোধের জন্য আমি যে প্রতিক্রিয়াটি পাঠাচ্ছি তার কাছ থেকে অনুরোধ করা হয়েছিল।

ব্যবহারকারী বর্তমানে নোড.জেএস থেকে হোস্ট-নেমটি কী দেখছেন তা নির্ধারণ করা সম্ভব?


এটি অনুরোধ শিরোনামে। ঠিক আছে আমি তাই ভেবেছিলাম কিন্তু এখন আমি এটি দেখতে পাচ্ছি না ...
হুঁ মম

8
সি জন এটি খুঁজে পেয়েছে, এটি এতে রয়েছে request.headers.host- ধন্যবাদ!
জেসি

ভেবেছিল ... শুধু ওলে নোগিনের বাইরে এনে দিচ্ছে না। খুশি হলাম!
jcolebrand

@ জেসে আরে, এটি আসলে সঠিক নয়। অনুরোধ.হেডারস.হোস্ট ওএসের উপর ভিত্তি করে সার্ভারের হোস্টনাম নয়, এটি এইচটিটিপি অনুরোধের সাথে প্রেরণ করা হোস্ট শিরোনামের নাম। যদি আপনার সার্ভার হোস্ট শিরোনাম নির্বিশেষে কোনও এইচটিটিপি অনুরোধের প্রতিক্রিয়া জানায় তবে সেই মানটি ক্লায়েন্টটি প্রেরণের সিদ্ধান্ত নেয় এমন কোনও কিছুই হতে পারে।
রব ইভানস

@ রোবেভানস - আপনি যদি প্রশ্নের শেষ লাইনটি পড়েন তবে ঠিক আমি যা খুঁজছিলাম। একটি নকল হোস্টনাম হেডার পাঠানো কোনও ক্লায়েন্ট হ'ল উদ্ভট ব্যবহারের বিষয় যা আমি ব্যক্তিগতভাবে সমর্থন করার চেষ্টা করার বিষয়ে চিন্তা করব না।
জেসি

উত্তর:


198

আপনি যদি এইচটিটিপি অনুরোধের কথা বলছেন তবে আপনি অনুরোধটির হোস্টটি এখানে খুঁজে পেতে পারেন:

request.headers.host

তবে এটি আগত অনুরোধের উপর নির্ভর করে।

Http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest এ আরও

আপনি যদি মেশিন / নেটিভ তথ্য সন্ধান করেন তবে প্রক্রিয়া অবজেক্টটি চেষ্টা করুন।


6
আহ, দুর্দান্ত - এফডাব্লুআইডাব্লু, অনুরোধ ছাড়া প্রকৃত হোস্টটি সনাক্ত করার কোনও উপায় থাকবে না, আপনি একাধিক হোস্ট কনফিগার করতে পারেন, তবে এটিই আমি খুঁজছিলাম!
জেসি

2
কৌতুকটি করেছেন, ধন্যবাদ! এক্সপ্রেস 4 এ, আমাকে এই আপডেটটি করতে হয়েছিল: req.headers.host
জিন বো

5
ভুল! request.headers.hostপ্রদান করে http://127.0.0.1তবে কোনও প্রোডাকশন সার্ভারের ডোমেন নাম নয়
সবুজ

10
req.headers.hostব্যবহারকারী দ্বারা সরবরাহ করা হয়। আমি পাইথনের 1 লাইনে একটি অনুরোধ তৈরি করতে পারি এবং আপনার কোডটি ক্র্যাশ না করে সেই ক্ষেত্র ছাড়াই আপনাকে একটি অনুরোধ পাঠাতে পারি
arboreal84

1
অনুরোধ.হেডারস.হোস্ট এখন অবচিত হয়েছে, পরিবর্তে আপনি অনুরোধটি ব্যবহার করতে পারেন। হেডারস হস্টনাম
সিয়াম দন্ড

281

আপনি ওএস মডিউলটি ব্যবহার করতে পারেন:

var os = require("os");
os.hostname();

দেখা Http://nodejs.org/docs/latest/api/os.html#os_os_hostname

আদেশ সহকারে:

  1. আপনি যদি আইপি ঠিকানা দিয়ে কাজ করতে পারেন - মেশিনগুলির বেশ কয়েকটি নেটওয়ার্ক কার্ড থাকতে পারে এবং আপনি এটি নির্দিষ্ট না করে নোডের সবগুলিই শুনবেন, সুতরাং কোন এনআইসি-র অনুরোধটি এসেছিল তা আগে আসার আগে আপনি জানেন না।

  2. হোস্টনাম একটি ডিএনএস বিষয় - ভুলে যাবেন না যে বেশ কয়েকটি ডিএনএস উপাধি একই মেশিনে নির্দেশ করতে পারে।


6
যদিও এটি মেশিনটির হোস্ট-নেম পাওয়ার জন্য কাজ করবে, আমি একাধিক হোস্টকে উত্তর দেওয়ার জন্য একটি মেশিন প্রস্তুত করতে পারি, সুতরাং এটি সঠিক হবে না।
জেসি

7
তবে এটি আরও ভাল - কারণ আপনি এটি মডিউলগুলিতে ব্যবহার করতে পারেন যা এইচটিটিপি অ্যাপ্লিকেশনটির প্রসঙ্গে কখনও চলতে পারে না
রাডাগাস্ট ব্রাউন

8
এবং গুরুত্বপূর্ণভাবে এই এটি প্রশ্নের উত্তর যেমনটি লেখা হয়েছিল তেমন উত্তর দেয়। আমি মনে করি প্রশ্নটি আসলে ভুল যদি এটির উত্তর না হয়।
রব ইভান্স

3
এটি hostnameকমান্ডের সাথে সম্পর্কিত যা একটি বৈধ ডিএনএস নাম হওয়া উচিত তবে এটির প্রয়োজন নেই। উদাহরণস্বরূপ, ওএস এক্স এর অধীনে আপনি এমন নাম পাবেন my-machine.localযা ডিএনএসের সাথে সমাধানযোগ্য নয়। মেশিনের বাহ্যিক আইপি বের করার জন্য আপনাকে এই পরিষেবাটি কার্যকর করতে এমন কোনও পরিষেবাতে আঘাত করতে হবে বা এটি বের করার জন্য STUN প্রোটোকল ব্যবহার করতে হবে।
তাদমান

6
এটি সর্বদা সঠিক। এটি মেশিনের হোস্টনামটি দেয়, যা প্রশ্নের শিরোনাম জিজ্ঞাসা করেছিল। (এইটির পাঠ্য একটি আলাদা প্রশ্ন জিজ্ঞাসা করেছিল)। আগত এইচটিটিপি অনুরোধে ব্যবহৃত হোস্টনামটি আলাদা বিষয়।
চিজো

18

এখানে একটি বিকল্প আছে

req.hostname

এক্সপ্রেস ডক্সে এটি সম্পর্কে পড়ুন ।


1
এটিই সঠিক উত্তর, যেমন রেকর্ড.হাইডার্স হস্ট হোস্ট দেয়: পোর্ট
একনার

req.hostname এবং req.host এর মধ্যে ভিন্নতা কী
রায়লোভলেস

1
req.host হ্রাস করা হয়। আপনি যদি এটি ব্যবহার করেন, এক্সপ্রেস একটি সতর্কবার্তা আউটপুট দেবে বলে 'ছিন্ন করা req.host: পরিবর্তে req.hostname ব্যবহার করুন'
bruceczk

8

আপনার যদি লিনাক্সে সম্পূর্ণরূপে যোগ্যতাসম্পন্ন ডোমেন নাম প্রয়োজন এবং কোনও এইচটিটিপি অনুরোধ না রয়েছে, আপনি ব্যবহার করতে পারেন:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});

1
BTW এর রয়েছে hostnameউইন্ডোজে কমান্ড (কিন্তু আপনি তা ডাকা পরামিতি ছাড়া)
jakub.g

7

প্রথমত, কোনও উত্তর দেওয়ার আগে আমি এই বিষয়টি নিয়ে সামনে এগিয়ে যেতে চাই যে হেডারদের বিশ্বাস করে আপনি ফিশিংয়ের মতো সুরক্ষিত দুর্বলতার দরজা উন্মুক্ত করছেন to পুনঃনির্দেশের উদ্দেশ্যে, URL টি অনুমোদিত হওয়ার আগে শিরোনামের থেকে মানগুলি ব্যবহার করবেন না।

তারপরে, আপনার অপারেটিং সিস্টেমের হোস্টনামটি অগত্যা ডিএনএসের সাথে মেলে না। আসলে, একটি আইপিতে একাধিক ডিএনএস নাম থাকতে পারে। সুতরাং এইচটিটিপি উদ্দেশ্যে আপনার অপারেটিং সিস্টেমের কনফিগারেশনে আপনার মেশিনকে দেওয়া হোস্টনাম ব্যবহারযোগ্য কিনা তার কোনও গ্যারান্টি নেই।

আমি ভাবতে পারি সেরা পছন্দটি হল আপনার এইচটিটিপি শ্রোতার পাবলিক আইপি প্রাপ্ত করা এবং ডিএনএসের মাধ্যমে এর নামটি সমাধান করা। dns.reverseআরও তথ্যের জন্য পদ্ধতিটি দেখুন । তবে, আবার, নোট করুন যে কোনও আইপি এর সাথে একাধিক নাম যুক্ত থাকতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.