উইন্ডোজ / আইআইএস সার্ভারে আমি কীভাবে বর্তমান পৃষ্ঠার পুরো URL পেতে পারি?


137

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

http:://www.example.com/OLD_FOLDER/index.php/post-title/

/post-title/ইউআরএলটির অংশটি কীভাবে দখল করা যায় তা আমি বুঝতে পারি না ।

$_SERVER["REQUEST_URI"]- যার প্রত্যেকে সুপারিশ করছে বলে মনে হচ্ছে - খালি স্ট্রিং ফিরিয়ে দিচ্ছে। $_SERVER["PHP_SELF"]শুধু ফিরে আসছে index.php। এটি কেন এবং আমি কীভাবে এটি ঠিক করতে পারি?


24
কেবল একটি মুদ্রণ_আর (S _ সার্ভার) করুন এবং দেখুন আপনার কাছে কোন ডেটা উপলব্ধ। আপনি যদি পুরো ইউআরএল পেতে পারেন তবে ফাইল নামটি পেতে আপনি প্যাথইনফো ($ url) কল করতে পারেন।
গ্রেডবট

18
এটি লক্ষ করা উচিত, এই প্রশ্নটি সাধারণভাবে পিএইচপি নয়, আইআইএস সম্পর্কিত। অ্যাপাচি এর নীচে আপনি কেবল $ _SERVER ['REQUEST_URI'] ব্যবহার করবেন।
মিশা তাতারিওউনিক্জ

@ পাইস অবশ্যই $ _SERVER ['REQUEST_URI'] যাওয়ার উপায় ... তবে আমি কীভাবে ইউআরআই-এর একটি নির্দিষ্ট অংশ দখল করতে পারি example উদাহরণস্বরূপ আমার এই ইউআরআই রয়েছে: / অ্যাপয়েন্টমেন্ট নিয়োগ / অ্যাডমিনিস্ট্রেটর / এভেনটস.এফপি / 219 ... আমি কীভাবে /events.php/ এর পরে এই নম্বরটি ধরতে পারি
দিমিত্রিস

উত্তর:


135

হতে পারে, কারণ আপনি আইআইএস এর অধীনে রয়েছেন,

$_SERVER['PATH_INFO']

আপনি যে URL টি ব্যাখ্যা করতে ব্যবহার করেছেন তার উপর ভিত্তি করে আপনি যা চান তা হ'ল।

অ্যাপাচি এর জন্য, আপনি ব্যবহার করবেন $_SERVER['REQUEST_URI']


হাই এটি ব্যবহার করে আমি কেবল নিম্নলিখিত ত্রুটিটি পেয়েছি? Notice: Undefined index: PATH_INFO in /home/tdpk/public_html/system/config.php on line 14
ছামেড

6
উফফ, শ্রত - ঠিক বুঝতে পেরেছি এই প্রশ্নটি আইআইএস সম্পর্কিত, এবং আমি ব্যবহার করছি। ডাউনভোটের জন্য দুঃখিত
জেসন এস

63
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
if ($_SERVER["SERVER_PORT"] != "80")
{
    $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} 
else 
{
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;

11
ওপি স্পষ্টভাবে আইআইএসে বলেছে - আইইআইএস-এর আওতায় REQUEST_URI উপলভ্য নয়
টম অগার

1
আপনার পিএইচপি করতে না পারলে আপনার কখনই ম্যাজিক কোট ব্যবহার করা উচিত নয়।
কেস

2
@ টমএগার আপনার সময়রেখাটি দেখতে হবে। আমি প্রশ্নের উত্তর দেওয়ার অনেক পরে ওপি এই যোগ করেছে। আসল প্রশ্নটি আমি উত্তর দেওয়ার প্রায় এক বছর আগে জিজ্ঞাসা করা হয়েছিল।
টাইলার কার্টার 16

7
@ স্ট্যান, একক ওভার ডাবলস ব্যবহার করে শূন্য নেট পারফরম্যান্স সুবিধা রয়েছে। নাড্ডা, জিপ, শূন্য নয়। এটি পিএইচপি 3 যুগের একটি পুরানো ওয়াইভের গল্প। অনুগ্রহ করে বিষয়বস্তুতে এ জাতীয় তুচ্ছ ম্যাঙ্গালিং করবেন না।
চার্লস

36

অ্যাপাচি এর জন্য:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']


হারমানের মন্তব্য হিসাবে আপনি এর HTTP_HOSTপরিবর্তে ব্যবহার করতে পারেন SERVER_NAME। সম্পূর্ণ আলোচনার জন্য এই সম্পর্কিত প্রশ্নটি দেখুন । সংক্ষেপে, আপনি সম্ভবত ব্যবহার করে ঠিক আছেন। এখানে 'হোস্ট' সংস্করণটি রয়েছে:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']


প্যারানয়েডের জন্য / কেন এটি গুরুত্বপূর্ণ

সাধারণত, আমি সেট ServerNameমধ্যে VirtualHostকারণ আমি চাই যে হতে ক্যানোনিকাল ওয়েবসাইটের ফর্ম। $_SERVER['HTTP_HOST']অনুরোধ হেডার উপর ভিত্তি করে সেট করা হয়। যদি সার্ভারটি সেই আইপি ঠিকানায় কোনও / সমস্ত ডোমেন নামগুলিতে প্রতিক্রিয়া জানায়, কোনও ব্যবহারকারী শিরোনামটি ছদ্মবেশী করতে পারে বা আরও খারাপ, কেউ আপনার আইপি ঠিকানায় ডিএনএস রেকর্ডটি নির্দেশ করতে পারে এবং তারপরে আপনার সার্ভার / ওয়েবসাইটটি কোনও ওয়েবসাইটকে ডায়নামিকের সাথে সরবরাহ করবে be একটি ভুল URL এ নির্মিত লিঙ্কগুলি। আপনি যদি পরবর্তী পদ্ধতিটি ব্যবহার করেন তবে আপনার যে ডোমেনটি পরিবেশন করতে চান তা প্রয়োগ করার জন্য আপনার নিজেরটিও কনফিগার করতে হবে vhostবা একটি .htaccessবিধি সেট করা উচিত , এরকম কিছু:

RewriteEngine On
RewriteCond %{HTTP_HOST} !(^stackoverflow.com*)$
RewriteRule (.*) https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server

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


2
এটি $_SERVER['HTTP_HOST']পরিবর্তে ব্যবহার করা উচিত $_SERVER['SERVER_NAME']। যদি ভার্চুয়াল হোস্ট সেটআপ থাকে, তবে SERVER_NAME সেই নামটি দেখায়। এটি এমন কিছু হতে পারে *.example.comযা বৈধ নয়।
হারমান জে। রাডট্কি III


9

URL টির কাজ পেতে এই শ্রেণীটি ব্যবহার করুন।

class VirtualDirectory
{
    var $protocol;
    var $site;
    var $thisfile;
    var $real_directories;
    var $num_of_real_directories;
    var $virtual_directories = array();
    var $num_of_virtual_directories = array();
    var $baseURL;
    var $thisURL;

    function VirtualDirectory()
    {
        $this->protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
        $this->site = $this->protocol . '://' . $_SERVER['HTTP_HOST'];
        $this->thisfile = basename($_SERVER['SCRIPT_FILENAME']);
        $this->real_directories = $this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['PHP_SELF'])));
        $this->num_of_real_directories = count($this->real_directories);
        $this->virtual_directories = array_diff($this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['REQUEST_URI']))),$this->real_directories);
        $this->num_of_virtual_directories = count($this->virtual_directories);
        $this->baseURL = $this->site . "/" . implode("/", $this->real_directories) . "/";
        $this->thisURL = $this->baseURL . implode("/", $this->virtual_directories) . "/";
    }

    function cleanUp($array)
    {
        $cleaned_array = array();
        foreach($array as $key => $value)
        {
            $qpos = strpos($value, "?");
            if($qpos !== false)
            {
                break;
            }
            if($key != "" && $value != "")
            {
                $cleaned_array[] = $value;
            }
        }
        return $cleaned_array;
    }
}

$virdir = new VirtualDirectory();
echo $virdir->thisURL;

10
এটি কি কিছুটা ওভারকিল নয়?
s3v3n

7

যোগ করুন

function my_url(){
    $url = (!empty($_SERVER['HTTPS'])) ?
               "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] :
               "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    echo $url;
}

তারপরে শুধু my_urlফাংশনটি কল করুন ।


5

আমি বর্তমান, সম্পূর্ণ URL টি পেতে নিম্নলিখিত ফাংশনটি ব্যবহার করি। এটি আইআইএস এবং অ্যাপাচি-তে কাজ করা উচিত।

function get_current_url() {

  $protocol = 'http';
  if ($_SERVER['SERVER_PORT'] == 443 || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
    $protocol .= 's';
    $protocol_port = $_SERVER['SERVER_PORT'];
  } else {
    $protocol_port = 80;
  }

  $host = $_SERVER['HTTP_HOST'];
  $port = $_SERVER['SERVER_PORT'];
  $request = $_SERVER['PHP_SELF'];
  $query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';

  $toret = $protocol . '://' . $host . ($port == $protocol_port ? '' : ':' . $port) . $request . (empty($query) ? '' : '?' . $query);

  return $toret;
}

আপনি যদি সিজিআই-ভিত্তিক অ্যাপাচি বা আইআইএস ব্যবহার না করেন তবে আরজিভি কাজ করবে না বলে আমি মনে করি। আমি নিয়মিত মোডে অ্যাপাচি 2 তে আপনার কোডটি চেষ্টা করেছি (সিজিআই মোড নয়) এবং ত্রুটিযুক্ত হয়ে যাচ্ছিলাম কারণ $ _SERVER ['আরভ'] [0] কোনও সূচক নয়। এও নোট করুন যে আমার সম্পূর্ণ পিএইচপি ত্রুটি প্রতিবেদন চালু আছে এবং এই ত্রুটিগুলি নোটিশের ত্রুটি ছিল।
ভোলোমাইক

একটি যাদুমন্ত্র মত কাজ শুধু কোয়েরি স্ট্রিং প্যারামিটার ত্রুটিগুলি রোধ করার জন্য একটি সামান্য আপডেট দরকার: $query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';। এটি অন্তর্ভুক্ত করার জন্য আমি আপনার উত্তর আপডেট করেছি।
জুয়ুল

4

REQUEST_URI অ্যাপাচি দ্বারা সেট করা হয়েছে, সুতরাং আপনি এটি আইআইএস দিয়ে পাবেন না। Var _SERVER এ একটি var_dump বা মুদ্রণ_আর করার চেষ্টা করুন এবং সেখানে কী মান বিদ্যমান যা আপনি ব্যবহার করতে পারবেন তা দেখুন।


3

এর POSTTITLE অংশ URL টি আপনার পরে index.phpফাইল যা mod_rewrite ব্যবহার না করেই বন্ধুত্বপূর্ণ URL গুলি সরবরাহ একটি সাধারণ উপায়। পোস্ট শিরোনাম আসলে ক্যোয়ারী স্ট্রিংয়েরই একটি অংশ, তাই আপনার এটি $ _SERVER ['QUERY_STRING'] ব্যবহার করে পাওয়ার পক্ষে সক্ষম হওয়া উচিত


2

আপনি যে পিএইচপি পৃষ্ঠাগুলি ব্যবহার করছেন তার উপরে নীচের লাইনটি ব্যবহার করুন $_SERVER['REQUEST_URI']। এটি আপনার সমস্যার সমাধান করবে।

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];

1

ওহ, একটি স্নিপেটের মজা!

if (!function_exists('base_url')) {
    function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
        if (isset($_SERVER['HTTP_HOST'])) {
            $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
            $hostname = $_SERVER['HTTP_HOST'];
            $dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);

            $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
            $core = $core[0];

            $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
            $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
            $base_url = sprintf( $tmplt, $http, $hostname, $end );
        }
        else $base_url = 'http://localhost/';

        if ($parse) {
            $base_url = parse_url($base_url);
            if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
        }

        return $base_url;
    }
}

এটির মতো সুন্দর রিটার্ন রয়েছে:

// A URL like http://stackoverflow.com/questions/189113/how-do-i-get-current-page-full-url-in-php-on-a-windows-iis-server:

echo base_url();    // Will produce something like: http://stackoverflow.com/questions/189113/
echo base_url(TRUE);    // Will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); //Will produce something like: http://stackoverflow.com/questions/

// And finally:
echo base_url(NULL, NULL, TRUE);
// Will produce something like:
//      array(3) {
//          ["scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/189113/"
//      }

0

সবাই কি ভুলে গেছেন http_build_url ?

http_build_url($_SERVER['REQUEST_URI']);

যখন কোনও প্যারামিটার এতে পাস করা হয় না তখন http_build_urlস্বয়ংক্রিয়ভাবে বর্তমান ইউআরএল ধরে নেওয়া হবে। আমিও REQUEST_URIপাশাপাশি অন্তর্ভুক্ত করার প্রত্যাশা করব , যদিও এটি জিইটি প্যারামিটারগুলি অন্তর্ভুক্ত করার জন্য প্রয়োজন বলে মনে হচ্ছে।

উপরের উদাহরণটি পুরো ইউআরএল ফিরিয়ে দেবে।


1
এটির জন্য pecl_http প্রয়োজন।
ওমর আবিদ

@ ওমারআবিড আমি এটির প্রস্তাব দিই। :-)
গাজুস

আমি আপনার অবস্থান বুঝতে। তবে যখন আপনার নিয়ন্ত্রণ নেই এমন বিভিন্ন প্ল্যাটফর্মগুলিতে যে স্ক্রিপ্টগুলি ব্যবহার করা হচ্ছে সেগুলি তৈরি করার সময়, আপনাকে বেশ কিছু মানক পছন্দ করতে হবে।
ওমর আবিদ

1
আপনি যদি একটি লাইব্রেরি তৈরি করছেন তবে প্রয়োজনীয়তাগুলি সংজ্ঞায়িত করা আপনার উপর নির্ভর করবে। মূল প্রশ্নটি এ জাতীয় দৃশ্যের মোটেও সমাধান করে না। অতএব, বিকল্পগুলির সকলের নামকরণ করা বোধগম্য।
গজুস

0

আমি নিম্নলিখিত কোড ব্যবহার করেছি এবং আমি সঠিক ফলাফল পাচ্ছি ...

<?php
    function currentPageURL() {
        $curpageURL = 'http';
        if ($_SERVER["HTTPS"] == "on") {
            $curpageURL.= "s";
        }
        $curpageURL.= "://";
        if ($_SERVER["SERVER_PORT"] != "80") {
            $curpageURL.= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else {
            $curpageURL.= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $curpageURL;
    }
    echo currentPageURL();
?>

এটি দুর্দান্ত কাজ করছে যদি আপনি এইচটিটিপিএস না করেন তবে আপনি এর লাইনটি সরাতে চান।

0

আমার অ্যাপাচি সার্ভারে, এটি আমাকে আপনি ঠিক যে ফর্ম্যাটটির সন্ধান করছেন তাতে পুরো URL দেয়:

$_SERVER["SCRIPT_URI"]

0

বিপরীত প্রক্সি সমর্থন!

কিছুটা আরও দৃust়। দ্রষ্টব্য এটি কেবলমাত্র 5.3বা আরও বেশি কাজ করবে ।

/*
 * Compatibility with multiple host headers.
 * Support of "Reverse Proxy" configurations.
 *
 * Michael Jett <mjett@mitre.org>
 */

function base_url() {

    $protocol = @$_SERVER['HTTP_X_FORWARDED_PROTO'] 
              ?: @$_SERVER['REQUEST_SCHEME']
              ?: ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https" : "http");

    $port = @intval($_SERVER['HTTP_X_FORWARDED_PORT'])
          ?: @intval($_SERVER["SERVER_PORT"])
          ?: (($protocol === 'https') ? 443 : 80);

    $host = @explode(":", $_SERVER['HTTP_HOST'])[0]
          ?: @$_SERVER['SERVER_NAME']
          ?: @$_SERVER['SERVER_ADDR'];

    // Don't include port if it's 80 or 443 and the protocol matches
    $port = ($protocol === 'https' && $port === 443) || ($protocol === 'http' && $port === 80) ? '' : ':' . $port;

    return sprintf('%s://%s%s/%s', $protocol, $host, $port, @trim(reset(explode("?", $_SERVER['REQUEST_URI'])), '/'));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.