অ্যাপাচি ব্যবহার করার সময় পিএইচপি-তে DOCUMENT_ROOT ভেরিয়েবলের ক্ষেত্রে বেমানান ট্রেলিং স্ল্যাশ


10

বিভিন্ন সার্ভার পরিবেশে, পিএইচপি $_SERVER['DOCUMENT_ROOT']সুপার গ্লোবাল কখনও কখনও একটি পিছনে স্ল্যাশ হয় এবং কখনও কখনও এটি না। আমি ভাবতাম এই সমস্যাটি সরাসরি ফাইলের DocumentRootমধ্যে অ্যাপাচি কীভাবে সংজ্ঞায়িত করা হয়েছে তার সাথে সম্পর্কিত httpd.conf:

উদাহরণস্বরূপ আমি ভেবেছিলাম যে যদি httpd.confএতে কোনও পিছনে স্ল্যাশ না থাকে:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

তারপর echo $_SERVER['DOCUMENT_ROOT']উচিত দিতে প্রথমেই / var / WWW / লাইভ / বর্তমান

এবং যদি httpd.confএতে একটি পিছনে স্ল্যাশ থাকে:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

তারপর echo $_SERVER['DOCUMENT_ROOT']উচিত দিতে প্রথমেই / var / WWW / লাইভ / বর্তমান /

এটি উবুন্টু 10.04 এ ক্ষেত্রে তবে আরএইচএল 5.5- $_SERVER['DOCUMENT_ROOT']এ অ্যাপাচি-তে কোনওটির সংজ্ঞা না থাকলেও একটি পিছনে স্ল্যাশ যুক্ত করা হয়েছে ।

কোন ধারণা কেন এমন হয়? আমি কি অনুভব করছি এমন কোনও কনফিগারেশন প্যারামিটার রয়েছে?


রেফারেন্সের জন্য:

  • পিএইচপি 5.3.3 এর আরএইচইএল (সমস্যাটি দেখা দেয়): পিএইচপি 5.3.3 (ক্লায়েন্ট) (নির্মিত: জুলাই 23 2010 16:26:53)
  • উবুন্টুর পিএইচপি সংস্করণ (কোনও ইস্যু নেই): পিএইচপি 5.3.2-1ubuntu4.2 সুহসিন-প্যাচ (ক্লায়ার) সহ (নির্মিত: মে 13 2010 20:03:45)

উত্তর:


6

আপনার ভার্চুয়াল হোস্টগুলির মধ্যে স্ল্যাশ কেন পরিবর্তন হচ্ছে তা আমার কোনও ধারণা নেই। যাইহোক, এটা গুরুত্বপূর্ণ? আপনার প্রোগ্রামগুলিতে কেবল একটি নতুন স্ল্যাশ যুক্ত করুন (ডাবল স্ল্যাশ উপস্থিত থাকলে অপসারণ করুন) এবং সমস্যাটি সমাধান হয়ে গেছে।

আমি ব্যবহার করি

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

4
আপনি সহজভাবে ব্যবহার করতে পারে $realpath = realpath($_SERVER['DOCUMENT_ROOT']);। এটি স্বয়ংক্রিয়ভাবে সমস্ত একাধিক স্ল্যাশ এবং অনুসরণকারীটিকে সরিয়ে দেয়। যদি আপনি সর্বদা একটি পিছনের স্ল্যাশ চান তবে উপরের কলটির ফলাফলের সাথে এটি সংযুক্ত করে realpath()। এর ভিতরে নয়।
ফ্লু

1
আমি হোস্টেরোপ হোস্টের (উবুন্টু আমার মনে হয়) এর মধ্যে একই সমস্যা (পিএইচপি 5.5) নিশ্চিত করতে পারি: স্ল্যাশ হয়েছে ... এবং উইন্ডোজ 7: কোনও স্ল্যাশ নেই (মোটামুটি সাম্প্রতিক
এক্সএএমপিপি

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'রিয়েলপথ যা করতে পারে তার চেয়ে কিছুটা দ্রুত হওয়া উচিত।
ফ্রাঙ্ক নোক


3

অ্যাপাচি পরিবেশে ডকুমেন্ট রুটকে একাধিক জায়গায় সংজ্ঞায়িত করা যায়।

হ্যাঁ, httpd.confএই সেটিংসগুলিতে রয়েছে তবে এ ফাইলটি ডিফল্ট কনফিগারেশনের জন্য ব্যবহৃত হওয়ায় সেগুলি ওভাররাইট করা যেতে পারে।

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি ভোস্ট কনফিগারেশন vhosts.dএবং sites-availableডিরেক্টরিগুলির অধীনে যাবেন ।


2

প্রস্তাবিত সমাধান:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

সমস্ত ইনস্টলেশন কাজ করে না।

উদাহরণস্বরূপ, আমার ক্ষেত্রে:

$_SERVER['DOCUMENT_ROOT']  = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"

আগের মতো একই সমস্যা।

আপনার প্রথম নির্দেশটি এতে পরিবর্তন করা উচিত:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";

কাঁটাগাছ


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'রিয়েলপথ যা করতে পারে তার চেয়ে কিছুটা দ্রুত হওয়া উচিত।
ফ্রাঙ্ক নোক

2

ডোমের উত্তর এই সমস্যার সমাধান, তবে স্টেফানভ্যাসকারের বক্তব্য হ'ল বিভিন্ন পরিবেশে আপনি দ্বিগুণ '//' এর সম্মুখীন হওয়ার কারণ। আপনার স্থানীয় মেশিনে, আপনার .conf ফাইলের মধ্যে যেখানে আপনি আপনার ভার্চুয়াল হোস্ট সেট আপ করেছেন, আপনি সম্ভবত সম্ভবত সংজ্ঞায়িত নথির মূলের শেষে / যুক্ত করেছেন, অন্যদিকে যে ব্যক্তি আপনার অন্যান্য পরিবেশ স্থাপন করেছেন তিনি করেননি বা বিপরীতভাবে।

যাইহোক, পিএইচপি-র $ _SERVER ['DOCUMENT_ROOT'] ব্যবহার করার সময় আপনি অ্যাপাচি পরিবেশের মান পাবেন যা কনফিগারেশনের ফলাফল। এক পরিবেশে '/' এবং অন্য পরিবেশে '//' এর কারণ এটি।


1

আমি বলব এটি অনুমান করা হয় যে DOCUMENT_ROOT এর কোনও পিছনে স্ল্যাশ নেই।

এই মানটি ওয়েব সার্ভার কনফিগারেশন থেকে পাস করা হয়েছে

Apache

DocumentRoot /var/www/html

এর অর্থ সূচিত হয় যে আমরা যে পথে যুক্ত করব তার একটি অগ্রণী স্ল্যাশ আমাদের থাকা উচিত।

পাথের যে কোনও জায়গায় ডাবল স্ল্যাশ '//' এর কোনও ফল নেই তা জেনেও (যখন ফাইল সিস্টেমের সাথে সম্পর্কিত ... কোনও HTTP url এ, এমন কিছু ঘটনা ঘটতে পারে যেখানে কিছু সমস্যা রয়েছে)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

DOCUMENT_ROOT এ যখন একটি পিছনে স্ল্যাশ হয় তখন আমরা সিসাদমিনকে এমন কোনও কারণে দোষ দিতে পারি যার কোনও পরিণতি নেই :)

এবং নিরাপদে তা উপেক্ষা করবেন?

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