কীভাবে পিএইচপি-তে সার্ভারের আইপি ঠিকানা সনাক্ত করতে হয়


122

আমি কীভাবে পিএইচপি-তে সার্ভারের আইপি ঠিকানা সনাক্ত করতে পারি?


2
আপনি কী আপনার অনুরোধের আইপি ঠিকানা বা আপনার অ্যাপ্লিকেশনটি চালাচ্ছেন মেশিনের আইপি বলতে চাইছেন?
Wosis

উত্তর:


175

সার্ভার আইপি এর জন্য এটি পছন্দ করুন:

$_SERVER['SERVER_ADDR'];

এবং এই বন্দরের জন্য

$_SERVER['SERVER_PORT'];

9
কিছু ভাগ হোস্ট এই আয় :: 1 নং
TheRealChx101

3
আপনার ওয়েব সার্ভারের সামনে লোড ব্যালান্সার ব্যবহৃত হচ্ছে তার উপর নির্ভর করে এটি ভুল হতে পারে। যদি আপনি চান এক্স-ফরোয়ার্ড করা-জন্য শিরোলেখের পাশাপাশি এই দৃশ্যকল্প মধ্যে: en.wikipedia.org/wiki/X-Forwarded-For
Ligemer

31
এটি সার্ভারের ঠিকানা নয়! এটি এমন ঠিকানা যা দূরবর্তী ব্রাউজারটি সার্ভারকে কল করে যা দূরবর্তী ব্যবহারকারীর নিয়ন্ত্রণে রয়েছে। John Kপরিবর্তে উত্তরটি ব্যবহার করুন
এরিয়েল

এটি সার্ভার আইপি দেয় না। কোনও কারণে এটি আমার স্থানীয় আইপি দিচ্ছে
থমাস উইলিয়ামস

এটি পিএইচপি-এফপিএম সার্ভারের ঠিকানাও দেয় না, তবে এটি সম্পর্কিত ওয়েব সার্ভারের জন্য (এনগিনেক্স, অ্যাপাচি)। সুতরাং এটি মাইএসকিএল-ক্লায়েন্ট হোস্ট স্পেসিফিকেশন (ব্যবহারকারী @ হোস্ট) এর জন্য সঠিক হবে না।
স্কিপাইলট

105

আপনি যদি পিএইচপি সংস্করণ 5.3 বা তার বেশি ব্যবহার করেন তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

$host= gethostname();
$ip = gethostbyname($host);

এটি যখন আপনি ওয়েব সার্ভারের মাধ্যমে চলমান না হয়ে স্ট্যান্ড-একা স্ক্রিপ্ট চালাচ্ছেন তখন ভাল কাজ করে।


পারফেক্ট, আমি যা খুঁজছি ধন্যবাদ জন
ফ্র্যাঙ্ক

6
+1 এটিই একমাত্র সমাধান যা কমান্ড লাইনের সাথে কাজ করবে।
অ্যাডাম এলসোডনেই

2
@ Andreas এটা করা উচিত নয়। স্থানীয় হোস্টনামটি /etc/hostsফাইলটিতে থাকা উচিত এবং দ্রুত হবে - যদিও এটি কেবলমাত্র হতে পারে 127.0.0.1। এটিতে যদি ডিএনএস কল করতে হয় তবে এটি বলার মতো ধীর হবে।
এরিয়েল

+1 তবে কেবল একটি প্রশ্ন .. আমি এটি একটি স্থানীয় সার্ভারে xampp দিয়ে চেষ্টা করেছিলাম এবং এটি 192.168etc আইপি ফিরিয়ে দেয় তবে .. এটি 127.0.0.1 হওয়া উচিত ??
আন্দ্রেয়া বোরি

এটি আমার জন্য কাজ করে তবে কিছু মেশিন এটির ডোমেন নাম দেখায়। এই সমস্যাটি কীভাবে সংশোধন করবেন।
ধরনি ধরন

19

উদাহরণ স্বরূপ:

$_SERVER['SERVER_ADDR']

যখন আপনার আইআইএস-এ রয়েছে, চেষ্টা করুন:

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']কেবলমাত্র আইআইএসের অধীনে উপলব্ধ যখন পিএইচপি কোনও সিজিআই মডিউল হিসাবে চলমান।
রুডি ভিজার

@ অরুডি_ভিসার এটি ফাস্টসিগির সাথেও কাজ করে তবে আপনি লোকাহোস্টের মাধ্যমে সংযুক্ত হন, পরিবর্তে :: 1 ফিরে আসবেন। আপনি যদি সার্ভারের নাম বা আইপি এর মাধ্যমে সংযুক্ত হন তবে আপনি আসল আইপিটি ফিরে পাবেন।
তারাবিআমরিনবোলাব

@ স্টারবিআমরিনবোলাবস ফাস্টজিজিআই হ'ল সিজিআই :) আমি একটি ইস্পি মডিউল হিসাবে চালানোর বিপরীতে বোঝাতে চাইছি, এটি একটি স্থিতিশীল প্ল্যাটফর্ম হিসাবে ফাস্টসিজিআইয়ের বড় আগমনের আগে লেখা হয়েছিল।
রুডি ভিজার

@ স্টারবিআমরিনবোলাব্লবগুলি যা কিছু দেখতে লাগে :: 1 সম্ভবত একটি আইপি 6 ঠিকানা
টবি অ্যালেন

@ টবিএলেন আপনাকে ধন্যবাদ :) অদ্ভুত বিষয়টি হ'ল আমার নেটওয়ার্ক আইপিভি 6 সমর্থন করে না, তবুও আমার সার্ভার (উইন্ডোজ 7 মেশিন) এর আইপি :: 1 হিসাবে আইপিভি 6 লুপব্যাক ঠিকানা হিসাবে রিপোর্ট করে।
তারকাবিআমরনবোলাব

13

আমি আমার আইপ ঠিকানাটি আমার সাথে সংযোগকারী কোনও দূরবর্তী মেশিনের নয়, এমন একটি উপায় পাওয়ার জন্য এই পৃষ্ঠায় এসেছি।

এটি উইন্ডোজ মেশিনের জন্য কাজ করবে না।

তবে কেউ যদি আমি যা খুঁজছিলাম তার জন্য অনুসন্ধান করে:

#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;

( লিনাক্স এবং ওএস এক্স-তে স্থানীয় মেশিনের প্রাথমিক আইপি ঠিকানা আমি কীভাবে পাব তা নির্লজ্জভাবে অভিযোজিত ? )


এটিই একমাত্র বিকল্প যা শেল থেকে পিএইচপি স্ক্রিপ্ট চালানোর সময় আসলে কাজ করে। প্রশ্ন: যখন একাধিক সক্রিয় ইন্টারফেস রয়েছে, তখন এটি ঠিক করবে যে কোন ঠিকানাটি ফিরে আসবে? আমি তারযুক্ত এবং ওয়্যারলেস ইথারনেট সংযোগগুলি সক্রিয়ভাবে পরীক্ষা করেছি এবং তারপরে কেবলমাত্র ওয়্যারলেস অ্যাক্টিভ সহ, এবং এটি উভয় বার wlan আইপি ফেরত দেয়। ভাল স্ক্রিপ্ট, ধন্যবাদ!
রায়ান গ্রিগস 18

কোনটি ফিরবে তা আসলে জানে না। এটি কেবলমাত্র ইফকনফিগের আউটপুট থেকে শেষ ইনট ইন্টারফেসটি প্রদান করে তবে 127.0.0.1 উপেক্ষা করে। আপনার যদি কেবল "সাধারণ" ইন্টারফেস থাকে তবে এটি বেশ ভাল কাজ করে। আপনি যদি "ifconfig wlan0 | ..." চান ইন্টারফেসটি নির্দিষ্ট করেন তবে এটি সম্ভবত নিরাপদ। এই স্ক্রিপ্টটি কোনও উপায়ে নিখুঁত নয় তবে এটি সাধারণ সেটিংসে কাজ করে এবং এটি নীতিগতভাবে এটি কীভাবে করা যায়, প্রয়োজন অনুযায়ী সামঞ্জস্য করা যায় তা প্রদর্শন করে।
ডোম

1
ifconfig | grep 'inet adder' | কাট-ডি ':' -ফ 2 | awk '{মুদ্রণ $ 1}' | গ্রেপ -ভে '^ (192 \ .168 | 10 \। 172 \ .1 [6789] |। 172 \ .2 [0-9] |। | 172 \ .3 [01] \। | 127 \।) ) 'এটি আমার সর্বশেষ সংশোধন। এটি সমস্ত স্থানীয় আইপিএস ফিল্টার করে এবং কেবল আপনাকে বহিরাগত দেয়
ডম

আমার একাধিক নেটওয়ার্ক ইন্টারফেস রয়েছে তাই আমি করেছিifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
জোনাথন

10

সর্বাধিক আপ-ভোট দেওয়া উত্তরগুলির মধ্যে কোনওটিই নির্ভরযোগ্যতার সাথে সার্ভারের সর্বজনীন ঠিকানা প্রদান করবে না। সাধারণত $_SERVER['SERVER_ADDR']সঠিক হবে, তবে আপনি যদি ভিপিএন এর মাধ্যমে সার্ভারটি অ্যাক্সেস করেন তবে এটি সম্ভবত কোনও পাবলিক ঠিকানার পরিবর্তে অভ্যন্তরীণ নেটওয়ার্কের ঠিকানাটি ফিরিয়ে আনবে এবং একই নেটওয়ার্কে না থাকলেও কিছু কনফিগারেশন খালি থাকবে বা অন্য কোনও নির্দিষ্ট থাকবে মান।

তেমনি, এমন পরিস্থিতি রয়েছে যেখানে $host= gethostname(); $ip = gethostbyname($host);সঠিক মানগুলি ফেরত দেয় না কারণ এটি উভয় ডিএনএসের উপর নির্ভর করে (অভ্যন্তরীণভাবে কনফিগার করা বা বাহ্যিক রেকর্ডগুলি) এবং সার্ভারের আইপি ঠিকানাটি বহির্ভূত করতে সার্ভারের হোস্টনেম সেটিংস। এই দুটি পদক্ষেপই সম্ভাব্য ত্রুটিযুক্ত। উদাহরণস্বরূপ, যদি সার্ভারের হোস্টনামটি কোনও ডোমেন নেম (যেমন HOSTNAME=yahoo.com) এর মতো ফর্ম্যাট হয় তবে (কমপক্ষে আমার php5.4 / Centos6 সেটআপে) gethostbynameস্থানীয় সার্ভারের পরিবর্তে ইয়াহু ডট কমের ঠিকানা সন্ধান করতে সরাসরি চলে যাবে।

তবুও, যেহেতু gethostbynameপাবলিক ডিএনএস-এ ফিরে আসে অপ্রকাশিত বা ভুল পাবলিক ডিএনএস রেকর্ড সহ একটি টেস্টিং সার্ভার রেকর্ড করে (উদাহরণস্বরূপ, আপনি সার্ভারটি localhostবা আইপি ঠিকানা দ্বারা অ্যাক্সেস করছেন , অথবা আপনি যদি স্থানীয় hostsফাইল ব্যবহার করে পাবলিক ডিএনএসকে ওভাররাইড করছেন ) তবে আপনি ' কোনও আইপি ঠিকানা ফিরে পাবে না (এটি কেবল হোস্টনামটি ফিরিয়ে দেবে) বা আরও খারাপ এটি জনসাধারণের ডিএনএস রেকর্ডে উল্লিখিত ভুল ঠিকানাটি উপস্থিত থাকলে বা ডোমেনের জন্য কোনও ওয়াইল্ডকার্ড উপস্থিত থাকলে তা ফিরিয়ে আনবে।

পরিস্থিতির উপর নির্ভর করে আপনিও এরকম কিছু করে তৃতীয় পদ্ধতির চেষ্টা করতে পারেন:

$external_ip = exec('curl http://ipecho.net/plain; echo');

এটির নিজস্ব ত্রুটি রয়েছে (একটি নির্দিষ্ট তৃতীয় পক্ষের সাইটের উপর নির্ভর করে এবং এমন কোনও নেটওয়ার্ক সেটিংস থাকতে পারে যা কোনও ভিন্ন হোস্ট বা প্রক্সি দিয়ে আউটবাউন্ড সংযোগগুলি চালিত করে) এবং gethostbynameএটি ধীর হতে পারে। আমি সত্যই নিশ্চিত নই যে কোন পদ্ধতিটি বেশিরভাগ ক্ষেত্রে সঠিক হয়ে উঠবে, তবে পাঠটি মনে রাখা উচিত যে নির্দিষ্ট পরিস্থিতি / কনফিগারেশনের ফলে এই সমস্ত পদ্ধতিরই ভুল আউটপুট আসবে ... তাই যদি সম্ভব হয় তবে যাচাই করে নিন যে আপনি যে পদ্ধতিটি করেছেন ব্যবহার করা আপনার প্রত্যাশা করা মানগুলি ফিরিয়ে দিচ্ছে।


9

আপনার সার্ভারে ইনস্টল করা কার্ল সম্পর্কে চিন্তা না করে আপনি উপরের উদাহরণগুলির অভিযোজন হিসাবে এটি ব্যবহার করতে পারেন।

<?php
      // create a new cURL resource
      $ch = curl_init ();

      // set URL and other appropriate options
      curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
      curl_setopt ($ch, CURLOPT_HEADER, 0);
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

      // grab URL and pass it to the browser

      $ip = curl_exec ($ch);
      echo "The public ip for this server is: $ip";
      // close cURL resource, and free up system resources
      curl_close ($ch);
    ?>


5

আপনি যদি ব্যাশ শেলের পিএইচপি ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন:

$server_name=exec('hostname');

কারণ $_SERVER[] SERVER_ADDR, HTTP_HOSTএবং SERVER_NAMEসেট করা নেই।


4

পূর্ববর্তী উত্তরগুলি সমস্ত $ _SERVER ['SERVER_ADDR'] দেয়। এটি কয়েকটি আইআইএস ইনস্টলেশনগুলিতে কাজ করবে না। আপনি যদি এটি আইআইএস-এ কাজ করতে চান তবে নিম্নলিখিতগুলি ব্যবহার করুন:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);

2

আমি এটি আমার জন্য কাজ করতে পেয়েছি: GetHostByName ("");

উইন্ডোজ 7 এ অ্যাপাচি ওয়েবসার্ভারে এক্সএএমএপপি ভি 1.7.1 চলছে। দুর্ভাগ্যক্রমে এটি আমার প্রবেশদ্বার আইপি ঠিকানা দেয়।


2

আমি সবেমাত্র একটি সহজ স্ক্রিপ্ট তৈরি করেছি যা আইআইএসে $ _SERVER ['REMOTE_ADDR'] এবং $ _SERVER ['SERVER_ADDR'] ফিরিয়ে আনবে যাতে আপনার প্রতিটি পরিবর্তনশীল পরিবর্তন করতে না হয়। প্রতিটি পৃষ্ঠার অন্তর্ভুক্ত আপনার পিএইচপি ফাইলটিতে কেবল এই পাঠ্যটি আটকে দিন।

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }


1

আপনি $HTTP_SERVER_VARS['server_ADDR']উপরের উত্তরগুলি থেকে কিছু না পেয়ে এবং আপনি যদি পিএইচপি-র পুরানো সংস্করণ ব্যবহার করছেন তবে আপনাকে ব্যবহার করতে হতে পারে


0

$ _SERVER অ্যারেটি পরীক্ষা করুন

echo $_SERVER['SERVER_ADDR'];

1
এটি "আসল আইপি" সন্ধান করে না, এটি স্বেচ্ছাসেবক, যাচাই করা না হওয়া HTTP শিরোনাম খুঁজে পায় যে কেউ সেট করতে পারে এবং আপনি যদি তাদের পছন্দ করেন তবে যে কেউ তাদের আইপি ছদ্মবেশ ব্যবহার করতে পারে। ক্লায়েন্ট যদি প্রক্সিটির পিছনে থাকে তবে তা হ'ল কোনও HTTP শিরোনামকে বিশ্বাস করবেন না। এটিও প্রশ্নটি মোটেও খাপ খায় না।
প্রতারণা করুন

2
এই উত্তরটি কীভাবে প্রশ্নের সাথে খাপ খায় না তা অনুমান করতে পারছি না। প্রশ্নটি ছিল: "আমি কীভাবে পিএইচপি-তে সার্ভারের আইপি ঠিকানাটি সনাক্ত করতে পারি?"। হয় ওপিতে আরও কীভাবে আরও ভাল জিজ্ঞাসা করতে হবে তা শিখতে হবে, অথবা কোনও প্রশ্ন কীভাবে পড়তে হবে তা শিখতে হবে। তদুপরি, ক্লায়েন্ট যদি প্রক্সিটির পিছনে থাকে তবে আপনি সার্ভার-সাইড থেকে যা কিছু চেষ্টা করুন তা বিবেচনা না করেই আপনি স্ক্রু হয়ে গেছেন। যখন সার্ভারটি প্রক্সিটির পিছনে থাকে তখন একেবারে ভিন্ন দৃশ্যটি হয়, যেহেতু আপনি এক্স-ফরওয়ার্ডড-ফর শিরোনাম দিয়ে পরীক্ষা করতে পারেন।
লুইস মাসুয়ালি

@ ডেসেজের $_SERVER["SERVER_ADDR"]এইচটিটিপি শিরোনামগুলির সাথে কোনও সম্পর্ক নেই। এটি সার্ভার সফ্টওয়্যার দ্বারা পূরণ করা হয়, _S _SERVER এর সমস্ত HTTP সম্পর্কিত স্টাফ HTTP_ এর সাথে উপসর্গযুক্ত।php.net/manual/en/remitted.variables.server.php
পঞ্চা

@ পঞ্চা আমার মন্তব্যটি এর সাথে সম্পর্কিত এই পোস্টের মূল সংশোধনের সাথে সম্পর্কিত।
প্রতারণা করুন

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