أستخدم هذا الرمز للحصول على عنوان URL الكامل:
$actual_link = 'http://'.$_SERVER['HTTP_Host'].$_SERVER['PHP_SELF'];
المشكلة هي أنني أستخدم بعض الأقنعة في .htaccess
، لذا فإن ما نراه في عنوان URL ليس دائمًا هو المسار الحقيقي للملف.
ما أحتاجه هو الحصول على عنوان URL ، وما هو مكتوب في عنوان URL ، ولا شيء أكثر ولا أقل - عنوان URL الكامل.
أحتاج لمعرفة كيفية ظهوره في شريط التنقل في متصفح الويب ، وليس المسار الحقيقي للملف على الخادم.
ألقِ نظرة على $_SERVER['REQUEST_URI']
، أي.
$actual_link = "http://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]";
(لاحظ أن بناء جملة السلسلة المقتبسة مزدوجًا هو صحيح تمامًا )
إذا كنت تريد دعم كل من HTTP و HTTPS ، يمكنك استخدام
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]";
ملاحظة المحرر: باستخدام هذا الرمز له آثار أمنية . يمكن للعميل تعيين HTTP_Host و REQUEST_URI على أي قيمة اعتباطية يريدها.
$url = "//{$_SERVER['HTTP_Host']}{$_SERVER['REQUEST_URI']}";
$escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );
echo '<a href="' . $escaped_url . '">' . $escaped_url . '</a>';
فيما يلي بعض التفاصيل حول المشكلات وحالات Edge لـ //example.com/path/ format
function url_Origin( $s, $use_forwarded_Host = false )
{
$ssl = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
$sp = strtolower( $s['SERVER_PROTOCOL'] );
$protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
$port = $s['SERVER_PORT'];
$port = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
$Host = ( $use_forwarded_Host && isset( $s['HTTP_X_FORWARDED_Host'] ) ) ? $s['HTTP_X_FORWARDED_Host'] : ( isset( $s['HTTP_Host'] ) ? $s['HTTP_Host'] : null );
$Host = isset( $Host ) ? $Host : $s['SERVER_NAME'] . $port;
return $protocol . '://' . $Host;
}
function full_url( $s, $use_forwarded_Host = false )
{
return url_Origin( $s, $use_forwarded_Host ) . $s['REQUEST_URI'];
}
$absolute_url = full_url( $_SERVER );
echo $absolute_url;
هذه نسخة معدلة بشكل كبير من http://snipplr.com/view.php?codeview&id=2734
.
مخطط: // اسم المستخدم: كلمة المرور @ المجال: المنفذ/المسار؟ query_string # fragment_id
لن يتم تضمين الأجزاء بالخط العريض في الوظيفة
username:password
من عنوان URL كامل أو الجزء (التجزئة).#fragment_id
إلى الخادم بواسطة العميل (المتصفح) ولن تتم إضافته إلى عنوان URL الكامل.$_GET
فقط على foo=bar2
لعنوان URL مثل /example?foo=bar1&foo=bar2
.$_SERVER['REQUEST_URI']
وإرجاع /example?foo=bar2
لعنوان URL مثل /example?foo=bar1&foo=bar2
، استخدم $_SERVER['QUERY_STRING']
في هذه الحالة.URL + URN
، ولكن بسبب الاستخدام الشائع ، يشير عنوان URL الآن إلى عنوان URI وعنوان URL.HTTP_X_FORWARDED_Host
إذا كنت لا تخطط لاستخدام وكلاء أو موازنات.Host
يجب أن يحتوي على رقم المنفذ ما لم يكن الرقم الافتراضي.$_SERVER['REQUEST_URI']
. يتم تشفير أي أحرف غير مدعومة من قبل المتصفح قبل إرسالها.$_SERVER['HTTP_Host']
ولا يتوفر دائمًا وفقًا للتعليقات الموجودة في PHP الدليل: http://php.net/manual/en/reserved.variables.php$_SERVER['HTTP_X_FORWARDED_Host']
بواسطة الموازنات ولم يتم ذكره في قائمة المتغيرات $_SERVER
في دليل PHP.$_SERVER['HTTPS']
. يختار العميل استخدام هذا ، لكن الخادم يعرض القيمة الفعلية إما فارغة أو "على".$_SERVER['SERVER_PORT']
. يقبل الخادم فقط الأرقام المسموح بها كمنافذ.$_SERVER['SERVER_PROTOCOL']
. يقبل الخادم بروتوكولات معينة فقط.$_SERVER['SERVER_NAME']
. تم ضبطه يدويًا في تكوين الخادم وهو غير متاح لـ IPv6 وفقًا لـ kralyk .HTTP_Host مقابل SERVER_NAME
هل رقم المنفذ مطلوب في رأس HTTP "المضيف" معلمة؟
https://stackoverflow.com/a/28049503/175071
أمثلة على:https://(www.)example.com/subFolder/myfile.php?var=blabla#555
// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname'] ???? https://example.com/subFolder
$x['basename'] ???? myfile.php?
$x['extension'] ???? php?k=blaa#12345 // Unsecure! also, read my notice about hashtag parts
$x['filename'] ???? myfile
// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme'] ???? https
$x['Host'] ???? example.com
$x['path'] ???? /subFolder/myfile.php
$x['query'] ???? k=blaa
$x['fragment'] ???? 12345 // ! read my notice about hashtag parts
//=================================================== //
//========== self-defined SERVER variables ========== //
//=================================================== //
$_SERVER["DOCUMENT_ROOT"] ???? /home/user/public_html
$_SERVER["SERVER_ADDR"] ???? 143.34.112.23
$_SERVER["SERVER_PORT"] ???? 80(or 443 etc..)
$_SERVER["REQUEST_SCHEME"] ???? https //similar: $_SERVER["SERVER_PROTOCOL"]
$_SERVER['HTTP_Host'] ???? example.com (or with WWW) //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"] ???? /subFolder/myfile.php?k=blaa
$_SERVER["QUERY_STRING"] ???? k=blaa
__FILE__ ???? /home/user/public_html/subFolder/myfile.php
__DIR__ ???? /home/user/public_html/subFolder //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"] ???? /subFolder/myfile.php?k=blaa
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)???? /subFolder/myfile.php
$_SERVER["PHP_SELF"] ???? /subFolder/myfile.php
// ==================================================================//
//if "myfile.php" is included in "PARENTFILE.php" , and you visit "PARENTFILE.PHP?abc":
$_SERVER["SCRIPT_FILENAME"]???? /home/user/public_html/parentfile.php
$_SERVER["PHP_SELF"] ???? /parentfile.php
$_SERVER["REQUEST_URI"] ???? /parentfile.php?abc
__FILE__ ???? /home/user/public_html/subFolder/myfile.php
// =================================================== //
// ================= handy variables ================= //
// =================================================== //
//If site uses HTTPS:
$HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' ); //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO']) ...
//To trim values to filename, i.e.
basename($url) ???? myfile.php
//excellent solution to find Origin
$debug_files = debug_backtrace();
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;
تنويه!:
DIRECTORY_SEPARATOR
تُرجع \
لاستضافة من نوع Windows ، بدلاً من /
.//(let's say, if wordpress is installed in subdirectory: http://example.com/wpdir/)
home_url() ???? http://example.com/wpdir/ //if is_ssl() is true, then it will be "https"
get_stylesheet_directory_uri() ???? http://example.com/wpdir/wp-content/themes/THEME_NAME [same: get_bloginfo('template_url') ]
get_stylesheet_directory() ???? /home/user/public_html/wpdir/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__) ???? http://example.com/wpdir/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__) ???? /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/
إليك حل باستخدام عبارة ثلاثية ، مع الحفاظ على الحد الأدنى من الكود:
$url = "http" . (($_SERVER['SERVER_PORT'] == 443) ? "s" : "") . "://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'];
هذه هي أصغر وأسهل طريقة للقيام بذلك ، على افتراض أن خادم الويب الخاص بالمستخدم يستخدم المنفذ القياسي 443 لـ HTTPS .
الطريقة المفضلة لدي عبر النظام الأساسي للعثور على عنوان URL الحالي هي:
$url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]";
ببساطة استخدام:
$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI']
function full_path()
{
$s = &$_SERVER;
$ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
$sp = strtolower($s['SERVER_PROTOCOL']);
$protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
$port = $s['SERVER_PORT'];
$port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
$Host = isset($s['HTTP_X_FORWARDED_Host']) ? $s['HTTP_X_FORWARDED_Host'] : (isset($s['HTTP_Host']) ? $s['HTTP_Host'] : null);
$Host = isset($Host) ? $Host : $s['SERVER_NAME'] . $port;
$uri = $protocol . '://' . $Host . $s['REQUEST_URI'];
$segments = explode('?', $uri, 2);
$url = $segments[0];
return $url;
}
ملاحظة: لقد قمت للتو بتحديث الرمز "Timo Huovinen" ، لذلك لن تحصل على أي عنوان URL. عنوان URL هذا واضح ويزيل أشياء مثل "؟ hi = i & am = a & get".
مثال:
http://www.website.com/index?get=information
سيظهر على النحو التالي:
http://www.website.com/index
ما لم تستخدم Get's لتحديد محتوى معين ، ثم استخدم الكود الخاص به! :-)
رمز واضح ، يعمل في جميع خوادم الويب (Apache ، nginx ، IIS ، ...):
$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'];
إليكم الحل - الكود مستوحى من Tracy Debugger . تم تغييره لدعم منافذ الخادم المختلفة. يمكنك الحصول على عنوان URL الحالي الكامل بما في ذلك $_SERVER['REQUEST_URI']
أو عنوان URL للخادم الأساسي فقط. تحقق وظيفتي:
function getCurrentUrl($full = true) {
if (isset($_SERVER['REQUEST_URI'])) {
$parse = parse_url(
(isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https://' : 'http://') .
(isset($_SERVER['HTTP_Host']) ? $_SERVER['HTTP_Host'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')) . (($full) ? $_SERVER['REQUEST_URI'] : null)
);
$parse['port'] = $_SERVER["SERVER_PORT"]; // Setup protocol for sure (80 is default)
return http_build_url('', $parse);
}
}
هنا رمز الاختبار:
// Follow $_SERVER variables was set only for test
$_SERVER['HTTPS'] = 'off'; // on
$_SERVER['SERVER_PORT'] = '9999'; // Setup
$_SERVER['HTTP_Host'] = 'some.crazy.server.5.name:8088'; // Port is optional there
$_SERVER['REQUEST_URI'] = '/150/tail/single/normal?get=param';
echo getCurrentUrl();
// http://some.crazy.server.5.name:9999/150/tail/single/normal?get=param
echo getCurrentUrl(false);
// http://some.crazy.server.5.name:9999/
لقد قمت بهذه الوظيفة للتعامل مع عنوان URL:
<?php
function curPageURL()
{
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
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;
}
?>
استخدم هذا الخط المفرد للعثور على عنوان URL للمجلد الأصلي (إذا لم يكن لديك وصول إلى http_build_url () الذي يأتي مع pecl_http):
$url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(dirname(__FILE__)));
نفس تقنية الإجابة المقبولة ، ولكن مع HTTPS / دعم ، وأكثر قابلية للقراءة:
$current_url = sprintf(
'%s://%s/%s',
isset($_SERVER['HTTPS']) ? 'https' : 'http',
$_SERVER['HTTP_Host'],
$_SERVER['REQUEST_URI']
);
يجب أن يكون HTTP_Host و REQUEST_URI في علامات اقتباس ، وإلا فإنه يلقي خطأ في PHP 7.2
استعمال:
$actual_link = 'https://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
إذا كنت تريد دعم كل من HTTP و HTTPS:
$actual_link = (isset($_SERVER['HTTPS']) ? 'https' : 'http').'://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
هذا من السهل جدًا القيام به مع متغيرات بيئة Apache. هذا يعمل فقط مع Apache 2 ، والتي أفترض أنك تستخدمها.
ببساطة استخدم الكود PHP:
<?php
$request_url = Apache_getenv("HTTP_Host") . Apache_getenv("REQUEST_URI");
echo $request_url;
?>
لقد جعلت هذه الفئة للتعامل مع بلدي URI
<?php
/** -------------------------------------------------------------------------------------------------------------------
* URI CLASS
* URI management class
*
* @author Sandu Liviu Catalin
* @email slc(dot)universe(at)gmail(dot)com
* @license Public Domain
**/
abstract class _URI
{
/** ---------------------------------------------------------------------------------------------------------------
* - BASE PARAMETERS
* $_Script_Hidden - Hide the script name from the returned URI
* $_Public_Path - Location where public resources are stored
* $_Public_Relative - Return the relative path version of public location
* $_Public_Skin - Is the skin directory located in the public directory
* $_Skin_Path - Location where skins are stored
* $_Skin_Relative - Return the relative path version of skin location
* $_Skin_Default - Use this as the default system skin
* $_Fallback_Base - Use this base URL if you can't extract the current URL
* $_Fallback_Scheme - Use this scheme if you can't find it automatically
* $_Fallback_User - Use this user name if you can't find it automatically
* $_Fallback_Passwd - Use this password if you can't find it automatically
* $_Fallback_Host - Use this Host if you can't find it automatically
* $_Fallback_Port - Use this port number if you can't find it automatically
* $_Fallback_Script - Use this script name if you can't find it automatically
* $_Separator_Scheme - Use this to separate the scheme from the rest of the url
* $_Separator_Credentials - Use this to separate the user name from the password
* $_Separator_Auth - Use this to separate the user name and password from Host
* $_Separator_Port - Use this to separate the port number from Host
* $_Separator_Query - Use this to separate the query data from base URL
* $_Separator_Fragment - Use this to separate the fragment data from query data
*/
protected static $_Script_Hidden;
protected static $_Public_Path;
protected static $_Public_Relative;
protected static $_Public_Skin;
protected static $_Skin_Path;
protected static $_Skin_Relative;
protected static $_Skin_Default;
protected static $_Fallback_Base;
protected static $_Fallback_Scheme;
protected static $_Fallback_User;
protected static $_Fallback_Passwd;
protected static $_Fallback_Host;
protected static $_Fallback_Port;
protected static $_Fallback_Script;
protected static $_Separator_Scheme;
protected static $_Separator_Credentials;
protected static $_Separator_Auth;
protected static $_Separator_Port;
protected static $_Separator_Query;
protected static $_Separator_Fragment;
/** ----------------------------------------------------------------------------------------------------------------
* CACHED BASES
* Precompiled common URLs for quick retrieval
*/
protected static $Base_Host;
protected static $Base_App;
protected static $Base_Script;
protected static $Base_Current;
protected static $Base_Public;
protected static $Base_Skin;
/** ----------------------------------------------------------------------------------------------------------------
* DATA CONTAINERS
* Raw URI segments saved from extracted data
*/
protected static $__Segments = array(
'SCHEME' => '',
'USER' => '',
'PASSWD' => '',
'Host' => '',
'PORT' => '',
'PATH' => '',
'SCRIPT' => '',
'INFO' => '',
'QUERY' => '',
);
/** ----------------------------------------------------------------------------------------------------------------
* PARSER KEYWORDS
* URI data asigned to specific keywords.
*/
protected static $__Parsers;
/** ----------------------------------------------------------------------------------------------------------------
* CLASS INITIALIZER
* Initialize the class
*
* @access public
* @param $Params [array] - An associative array of supported parrameters
* @return void
*/
public static function __Init($Params=array())
{
// Configure the class
self::$_Script_Hidden = (isset($Params['Script_Hidden'])) ? $Params['Script_Hidden'] : FALSE;
self::$_Public_Path = (isset($Params['Public_Path'])) ? $Params['Public_Path'] : 'public';
self::$_Public_Relative = (isset($Params['Public_Relative'])) ? $Params['Public_Relative'] : TRUE;
self::$_Public_Skin = (isset($Params['Public_Skin'])) ? $Params['Public_Skin'] : TRUE;
self::$_Skin_Path = (isset($Params['Skin_Path'])) ? $Params['Skin_Path'] : 'themes';
self::$_Skin_Relative = (isset($Params['Skin_Relative'])) ? $Params['Skin_Relative'] : TRUE;
self::$_Skin_Default = (isset($Params['Skin_Default'])) ? $Params['Skin_Default'] : 'default';
self::$_Fallback_Base = (isset($Params['Fallback_Base'])) ? $Params['Fallback_Base'] : '127.0.0.1';
self::$_Fallback_Scheme = (isset($Params['Fallback_Scheme'])) ? $Params['Fallback_Scheme'] : 'http';
self::$_Fallback_User = (isset($Params['Fallback_User'])) ? $Params['Fallback_User'] : '';
self::$_Fallback_Passwd = (isset($Params['Fallback_Passwd'])) ? $Params['Fallback_Passwd'] : '';
self::$_Fallback_Host = (isset($Params['Fallback_Host'])) ? $Params['Fallback_Host'] : '127.0.0.1';
self::$_Fallback_Port = (isset($Params['Fallback_Port'])) ? $Params['Fallback_Port'] : '';
self::$_Fallback_Script = (isset($Params['Fallback_Script'])) ? $Params['Fallback_Script'] : 'index.php';
self::$_Separator_Scheme = (isset($Params['Separator_Scheme'])) ? $Params['Separator_Scheme'] : '://';
self::$_Separator_Credentials = (isset($Params['Separator_Credentials'])) ? $Params['Separator_Credentials'] : ':';
self::$_Separator_Auth = (isset($Params['Separator_Auth'])) ? $Params['Separator_Auth'] : '@';
self::$_Separator_Port = (isset($Params['Separator_Port'])) ? $Params['Separator_Port'] : ':';
self::$_Separator_Query = (isset($Params['Separator_Query'])) ? $Params['Separator_Query'] : '?';
self::$_Separator_Fragment = (isset($Params['Separator_Fragment'])) ? $Params['Separator_Fragment'] : '#';
// Do some clean up of the configurations
self::$_Public_Path = implode('/', explode('/', str_replace(array('/', '\\'), '/', self::$_Public_Path)));
self::$_Skin_Path = implode('/', explode('/', str_replace(array('/', '\\'), '/', self::$_Skin_Path)));
// Extract the URL information
self::Extract();
// Precompile common bases
self::$Base_Host = self::Compile('Host');
self::$Base_App = self::Compile('PATH');
self::$Base_Script = self::$Base_App.(self::$_Script_Hidden ? '' : '/'.self::$__Segments['SCRIPT']);
self::$Base_Current = self::$Base_Script.(empty(self::$__Segments['INFO']) ? '' : '/'.self::$__Segments['INFO']);
self::$Base_Public = self::$_Public_Relative ? self::$_Public_Path : self::$Base_App.'/'.self::$_Public_Path;
self::$Base_Skin = self::$_Skin_Relative ? self::$_Skin_Path : self::$Base_Public.'/'.self::$_Skin_Path;
self::$Base_Skin .= '/'.self::$_Skin_Default;
// Setup the parsers
self::$__Parsers['SR_Key'][] = '%HostBase%';
self::$__Parsers['SR_Data'][] =& self::$Base_Host;
self::$__Parsers['SR_Key'][] = '%AppBase%';
self::$__Parsers['SR_Data'][] =& self::$Base_App;
self::$__Parsers['SR_Key'][] = '%ScriptBase%';
self::$__Parsers['SR_Data'][] =& self::$Base_Script;
self::$__Parsers['SR_Key'][] = '%CurrentBase%';
self::$__Parsers['SR_Data'][] =& self::$Base_Current;
self::$__Parsers['SR_Key'][] = '%PublicBase%';
self::$__Parsers['SR_Data'][] =& self::$Base_Public;
self::$__Parsers['SR_Key'][] = '%SkinBase%';
self::$__Parsers['SR_Data'][] =& self::$Base_Skin;
self::$__Parsers['SR_Data'][] =& self::$__Segments['SCHEME'];
self::$__Parsers['SR_Key'][] = '%UserSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['USER'];
self::$__Parsers['SR_Key'][] = '%PasswdSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['PASSWD'];
self::$__Parsers['SR_Key'][] = '%HostSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['Host'];
self::$__Parsers['SR_Key'][] = '%PortSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['PORT'];
self::$__Parsers['SR_Key'][] = '%PathSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['PATH'];
self::$__Parsers['SR_Key'][] = '%ScriptSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['SCRIPT'];
self::$__Parsers['SR_Key'][] = '%InfoSegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['INFO'];
self::$__Parsers['SR_Key'][] = '%QuerySegment%';
self::$__Parsers['SR_Data'][] =& self::$__Segments['QUERY'];
self::$__Parsers['SR_Key'][] = '%PublicPath%';
self::$__Parsers['SR_Data'][] =& self::$_Public_Path;
self::$__Parsers['SR_Key'][] = '%SkinPath%';
self::$__Parsers['SR_Data'][] =& self::$_Skin_Path;
self::$__Parsers['SR_Key'][] = '%DefaultSkin%';
self::$__Parsers['SR_Data'][] =& self::$_Skin_Default;
// Everything OK so far
}
/** ----------------------------------------------------------------------------------------------------------------
* URI EXTRACTOR
* Try every posibility to obtain all the segments of the current URL
*
* @access public
* @return array
*/
public static function Extract()
{
// No point in executing twice to get the same result
if (!empty(self::$__Segments['Host'])) return self::$__Segments;
// Let's try to have a falback for most basic data
$Script_URI = (isset($_SERVER['SCRIPT_URI'])) ? parse_url($_SERVER['SCRIPT_URI']) : array();
if (empty($Script_URI)) {
$Script_URI = parse_url(self::$_Fallback_Base);
}
// Try ever possibility to obtain the data that surounds the script name
if (isset($_SERVER['PHP_SELF'])) {
$Script_Path = $_SERVER['PHP_SELF'];
} elseif (isset($_SERVER['REQUEST_URI'])) {
$Script_Path = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']);
} elseif (isset($Script_URI['path'])) {
$Script_Path = $Script_URI['path'];
} elseif (isset($_SERVER['SCRIPT_NAME'])) {
$Script_Path = isset($_SERVER['SCRIPT_NAME']).(isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
} elseif (isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['SCRIPT_FILENAME'])) {
$Script_Path = substr($_SERVER['SCRIPT_FILENAME'], strlen($_SERVER['DOCUMENT_ROOT']),
(strlen($_SERVER['SCRIPT_FILENAME'])-strlen($_SERVER['DOCUMENT_ROOT'])));
$Script_Path .= (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
} else {
$Script_Path = '';
}
// Explode the previously extracted data
if (strlen($Script_Path) > 0) {
$Script_Path = preg_split('/[\/]/', $Script_Path, -1, PREG_SPLIT_NO_EMPTY);
} else {
$Script_Path = array();
}
// Try to obtain the name of the currently executed script
if (isset($_SERVER['SCRIPT_FILENAME'])) {
$Script_Name = basename($_SERVER['SCRIPT_FILENAME']);
} elseif (isset($_SERVER['SCRIPT_NAME'])) {
$Script_Name = basename($_SERVER['SCRIPT_NAME']);
} else {
$Script_Name = self::$_Fallback_Script;
}
// Try to find the name of the script in the script path
$Script_Split = (is_string($Script_Name)) ? array_search($Script_Name, $Script_Path, TRUE) : NULL;
// Try to obtain the request scheme
if (isset($_SERVER['REQUEST_SCHEME'])) {
self::$__Segments['SCHEME'] = $_SERVER['REQUEST_SCHEME'];
} elseif (isset($_SERVER['SERVER_PROTOCOL'])) {
self::$__Segments['SCHEME'] = strtolower($_SERVER['SERVER_PROTOCOL']);
self::$__Segments['SCHEME'] = substr(self::$__Segments['SCHEME'], 0, strpos(self::$__Segments['SCHEME'], '/'));
self::$__Segments['SCHEME'] .= (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 's' : '';
} elseif (isset($Script_URI['scheme'])) {
self::$__Segments['SCHEME'] = $Script_URI['scheme'];
} else {
self::$__Segments['SCHEME'] = self::$_Fallback_Scheme;
}
// Try to obtain the user name (if one was used)
if (isset($_SERVER['PHP_AUTH_USER'])) {
self::$__Segments['USER'] = $_SERVER['PHP_AUTH_USER'];
} elseif (isset($Script_URI['user'])) {
self::$__Segments['USER'] = $Script_URI['user'];
} else {
self::$__Segments['USER'] = self::$_Fallback_User;
}
// Try to obtain the user password (if one was used)
if (isset($_SERVER['PHP_AUTH_PW'])) {
self::$__Segments['PASSWD'] = $_SERVER['PHP_AUTH_PW'];
} elseif (isset($Script_URI['pass'])) {
self::$__Segments['PASSWD'] = $Script_URI['pass'];
} else {
self::$__Segments['PASSWD'] = self::$_Fallback_Passwd;
}
// Try to obtai the Host name
if (isset($_SERVER['SERVER_NAME'])) {
self::$__Segments['Host'] = $_SERVER['SERVER_NAME'];
} elseif (isset($_SERVER['HTTP_Host'])) {
self::$__Segments['Host'] = $_SERVER['HTTP_Host'];
} elseif (isset($Script_URI['Host'])) {
self::$__Segments['Host'] = $Script_URI['Host'];
} else {
self::$__Segments['Host'] = self::$_Fallback_Host;
}
// Try to obtain the port number (if one was used)
if (isset($Script_URI['port'])) {
self::$__Segments['PORT'] = $Script_URI['port'];
} else {
self::$__Segments['PORT'] = self::$_Fallback_Port;
}
// Try to obtain the path to the script
if (is_numeric($Script_Split)) {
self::$__Segments['PATH'] = implode('/', array_slice($Script_Path, 0, $Script_Split, TRUE));
} else {
self::$__Segments['PATH'] = '';
}
// Try to obtain the Script name
if (is_string($Script_Name)) {
self::$__Segments['SCRIPT'] = $Script_Name;
} else {
self::$__Segments['SCRIPT'] = '';
}
// Try to obtain any passed info
if (isset($_SERVER['PATH_INFO'])) {
self::$__Segments['INFO'] = implode('/', preg_split('/[\/]/', $_SERVER['PATH_INFO'], -1, PREG_SPLIT_NO_EMPTY));
} elseif (is_numeric($Script_Split)) {
self::$__Segments['INFO'] = implode('/', array_slice($Script_Path, $Script_Split+1));
} else {
self::$__Segments['INFO'] = '';
}
// -----Pending Feature: Try to also extract the query string
// Return the extracted URI segments
return self::$__Segments;
}
/** ----------------------------------------------------------------------------------------------------------------
* URI COMPILER
* Compile raw URI segments into a usable URL
*
* @access public
* @param $Until [string] - The name of the segment where compilation should stop and return
* @return string
*/
public static function Compile($Until=NULL)
{
$URI= '';
$Until = (is_string($Until)) ? strtoupper($Until) : $Until;
if ($Until === 'SCHEME') {
return $URI .= (self::$__Segments['SCHEME'] !== '') ? self::$__Segments['SCHEME'].self::$_Separator_Scheme : '';
} else {
$URI .= (self::$__Segments['SCHEME'] !== '') ? self::$__Segments['SCHEME'].self::$_Separator_Scheme : '';
}
if ($Until === 'USER') {
return $URI .= (self::$__Segments['USER'] !== '') ? self::$__Segments['USER'].self::$_Separator_Credentials : '';
} else {
$URI .= (self::$__Segments['USER'] !== '') ? self::$__Segments['USER'] : '';
}
$URI .= (self::$__Segments['USER'] !== '' || self::$__Segments['PASSWD'] !== '') ? self::$_Separator_Credentials : '';
if ($Until === 'PASSWD') {
return $URI .= (self::$__Segments['PASSWD'] !== '') ? self::$__Segments['PASSWD'].self::$_Separator_Auth : '';
} else {
$URI .= (self::$__Segments['PASSWD'] !== '') ? self::$__Segments['PASSWD'] : '';
}
$URI .= (self::$__Segments['USER'] !== '' || self::$__Segments['PASSWD'] !== '') ? self::$_Separator_Auth : '';
if ($Until === 'Host') {
return $URI .= (self::$__Segments['Host'] !== '') ? self::$__Segments['Host'] : '';
} else {
$URI .= (self::$__Segments['Host'] !== '') ? self::$__Segments['Host'] : '';
}
if ($Until === 'PORT') {
return $URI .= (self::$__Segments['PORT'] !== '') ? self::$_Separator_Port.self::$__Segments['PORT'] : '';
} else {
$URI .= (self::$__Segments['PORT'] !== '') ? self::$_Separator_Port.self::$__Segments['PORT'] : '';
}
if ($Until === 'PATH') {
return $URI .= (self::$__Segments['PATH'] !== '') ? '/'.self::$__Segments['PATH'] : '';
} else {
$URI .= (self::$__Segments['PATH'] !== '') ? '/'.self::$__Segments['PATH'] : '';
}
if ($Until === 'SCRIPT') {
return $URI .= (self::$__Segments['SCRIPT'] !== '') ? '/'.self::$__Segments['SCRIPT'] : '';
} else {
$URI .= (self::$__Segments['SCRIPT'] !== '') ? '/'.self::$__Segments['SCRIPT'] : '';
}
if ($Until === 'INFO') {
return $URI .= (self::$__Segments['INFO'] !== '') ? '/'.self::$__Segments['INFO'] : '';
} else {
$URI .= (self::$__Segments['INFO'] !== '') ? '/'.self::$__Segments['INFO'] : '';
}
return $URI;
}
/** ----------------------------------------------------------------------------------------------------------------
* SEGMENT RETRIEVER
* Return a specific URI segment
*
* @access public
* @param $Name [string] - The name of the segment you want
* @return string (on success) bool (on failure)
*/
public static function Segment($Name)
{
if (isset(self::$__Segments[$Name])) {
return self::$__Segments[$Name];
} return FALSE;
}
/** ----------------------------------------------------------------------------------------------------------------
* BASE RETRIEVER
* Return a specific precompiled base
*
* @access public
* @param $Name [string] - The name of the base you want
* @return mixed (on success) boolean (on failure)
*/
public static function Base($Name)
{
switch ($Name) {
case 'Host':
case 'Domain':
return self::$Base_Host;
break;
case 'App':
case 'Base':
return self::$Base_App;
break;
case 'Script':
case 'Index':
return self::$Base_Script;
break;
case 'Current':
case 'This':
return self::$Base_Current;
break;
case 'Public':
case 'Web':
return self::$Base_Public;
break;
case 'Skin':
case 'Theme':
return self::$Base_Skin;
break;
case 'All':
return array(
'Host'=>self::$Base_Host,
'App'=>self::$Base_App,
'Script'=>self::$Base_Script,
'Current'=>self::$Base_Current,
'Public'=>self::$Base_Public,
'Skin'=>self::$Base_Skin,
);
break;
} return FALSE;
}
/** ----------------------------------------------------------------------------------------------------------------
* STRING PARSER
* Replace known keywords in the specified string with current URI data
*
* @access public
* @param $String [string] - A string that you want to parse
* @return void
*/
public static function Parse($String)
{
if (is_string($String)) {
return str_replace(self::$__Parsers['SR_Key'], self::$__Parsers['SR_Data'], $String);
} elseif (is_array($String)) {
foreach ($String as $K => $V) {
$Parsed[$K] = self::$replace($V);
} return $Parsed;
} return FALSE;
}
}
if (isset($_URI_Params)) {
_URI::__Init($_URI_Params);
} else {
_URI::__Init();
}
بالطبع عليك أن تتكيف مع احتياجاتك ونظامك!؟!
<?php
// Change a few parameters before loading the class.
$_URI_Params = array(
'Public_Relative' => FALSE,
'Skin_Relative' => FALSE,
'Skin_Default' => 'classic',
// etc.
);
// Get the URI class
require('uri.php');
// Output all extracted URI segments
echo '<pre>';
var_dump(_URI::Extract());
echo '</pre>';
// Output extracted segments individually
echo 'Scheme: '._URI::Segment('SCHEME').'<br/>';
echo 'User: '._URI::Segment('USER').'<br/>';
echo 'Password: '._URI::Segment('PASSWD').'<br/>';
echo 'Host: '._URI::Segment('Host').'<br/>';
echo 'Port: '._URI::Segment('PORT').'<br/>';
echo 'Path: '._URI::Segment('PATH').'<br/>';
echo 'Script: '._URI::Segment('SCRIPT').'<br/>';
echo 'Info: '._URI::Segment('INFO').'<br/>';
// Compile extracted segments into a usable URL
echo '<br/>';
echo 'Full Compiled URI: '._URI::Compile().'<br/>';
echo '<br/>';
// Output precompiled common bases for a faster result and better performance
echo 'Host Base: '._URI::Base('Host').'<br/>';
echo 'Application Base: '._URI::Base('App').'<br/>';
echo 'Running Script: '._URI::Base('Script').'<br/>';
echo 'Current URI Base: '._URI::Base('Current').'<br/>';
echo 'Public Folder Base: '._URI::Base('Public').'<br/>';
echo 'Skin Folder Base: '._URI::Base('Skin').'<br/>';
// Get all the precompiled bases in an associative array
echo '<pre>';
var_dump(_URI::Base('All'));
echo '</pre>';
// Parse an example string and replace known keys with actual URI data.
echo _URI::Parse('This is my current domain: %HostBase%
And the current application is here: %AppBase%
I load my skins form: %SkinBase%
etc.
');
لا تزال بحاجة إلى الكمال لكنها حل إله لنظام URI مركزي: D
جرب هذا:
print_r($_SERVER);
$_SERVER
هو صفيف يحتوي على معلومات مثل الرؤوس والمسارات ومواقع البرامج النصية. يتم إنشاء الإدخالات في هذه المجموعة بواسطة خادم الويب. ليس هناك ما يضمن أن كل خادم ويب سيوفر أيًا من هذه الميزات ؛ قد تحذف الخوادم بعضًا ، أو تزود آخرين غير مدرجين هنا. ومع ذلك ، يتم حساب عدد كبير من هذه المتغيرات في مواصفات »CGI/1.1 ، لذلك يجب أن تكون قادرًا على توقع هذه المتغيرات.
يحتوي $HTTP_SERVER_VARS
على نفس المعلومات الأولية ، لكنه ليس عالميًا. (لاحظ أن $HTTP_SERVER_VARS
و $_SERVER
هما متغيرات مختلفة وأن PHP يعالجهما على هذا النحو)
يمكنك استخدام http_build_url بدون أي وسيطات للحصول على كامل URL من الصفحة الحالية:
$url = http_build_url();
هذا هو الحل لمشكلتك:
//Fetch page URL by this
$url = $_SERVER['REQUEST_URI'];
echo "$url<br />";
//It will print
//fetch Host by this
$Host=$_SERVER['HTTP_Host'];
echo "$Host<br />";
//You can fetch the full URL by this
$fullurl = "http://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
echo $fullurl;
لقد استخدمت هذا البيان.
$base = "http://$_SERVER[SERVER_NAME]:$_SERVER[SERVER_PORT]$my_web_base_path";
$url = $base . "/" . dirname(dirname(__FILE__));
آمل أن يكون هذا سيساعدك.
لقد استخدمت الكود أدناه ، وهو يعمل بشكل جيد بالنسبة لي ، في كلتا الحالتين ، HTTP و HTTPS.
function curPageURL() {
if(isset($_SERVER["HTTPS"]) && !empty($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] != 'on' )) {
$url = 'https://'.$_SERVER["SERVER_NAME"];//https url
} else {
$url = 'http://'.$_SERVER["SERVER_NAME"];//http url
}
if(( $_SERVER["SERVER_PORT"] != 80 )) {
$url .= $_SERVER["SERVER_PORT"];
}
$url .= $_SERVER["REQUEST_URI"];
return $url;
}
echo curPageURL();
public static function getCurrentURL()
{
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === false ? 'http' : 'https';
$Host = $_SERVER['HTTP_Host'];
$script = $_SERVER['SCRIPT_NAME'];
$params = $_SERVER['QUERY_STRING'] == '' ? '' : '?' . $_SERVER['QUERY_STRING'];
return $protocol . '://' . $Host . $script . $params;
}
استخدام بسيط جدا:
function current_url() {
$current_url = ( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] : 'https://'.$_SERVER["SERVER_NAME"];
$current_url .= ( $_SERVER["SERVER_PORT"] != 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
$current_url .= $_SERVER["REQUEST_URI"];
return $current_url;
}
$base_dir = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite
$doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$base_url = preg_replace("!^{$doc_root}!", '', $base_dir); # ex: '' or '/mywebsite'
$base_url = str_replace('\\', '/', $base_url);//On Windows
$base_url = str_replace($doc_root, '', $base_url);//On Windows
$protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https';
$port = $_SERVER['SERVER_PORT'];
$disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
$domain = $_SERVER['SERVER_NAME'];
$full_url = "$protocol://{$domain}{$disp_port}{$base_url}"; # Ex: 'http://example.com', 'https://example.com/mywebsite', etc.
المصدر: http://blog.lavoie.sl/2013/02/php-document-root-path-and-url-detection.html
فيما يلي أساس إصدار أكثر أمانًا للإجابة المقبولة ، باستخدام PHP's filter_input function ، والتي تعوض أيضًا عن النقص المحتمل في $_SERVER['REQUEST_URI']
:
$protocol_https = filter_input(INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING);
$Host = filter_input(INPUT_SERVER, 'HTTP_Host', FILTER_SANITIZE_URL);
$request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL);
if(strlen($request_uri) == 0)
{
$request_uri = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL);
$query_string = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_URL);
if($query_string)
{
$request_uri .= '?' . $query_string;
}
}
$full_url = ($protocol_https ? 'https' : 'http') . '://' . $Host . $request_uri;
يمكنك استخدام بعض المرشحات مختلفة لتعديلها حسب رغبتك.
يمكنك الاستفادة من HTTP_Origin
كما هو موضح في المقتطف أدناه:
if ( ! array_key_exists( 'HTTP_Origin', $_SERVER ) ) {
$this->referer = $_SERVER['SERVER_NAME'];
} else {
$this->referer = $_SERVER['HTTP_Origin'];
}
هذا يعمل مع كل من HTTP و HTTPS.
echo 'http' . (($_SERVER['HTTPS'] == 'on') ? 's' : '') . '://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'];
إخراج شيء مثل هذا.
https://example.com/user.php؟token=3f0d9sickc0flmg8hnsngk5u07&access_level=application
أعتقد أن هذه الطريقة جيدة..جربها
if($_SERVER['HTTP_Host'] == "localhost"){
define('SITEURL', 'http://' . $_SERVER['HTTP_Host']);
define('SITEPATH', $_SERVER['DOCUMENT_ROOT']);
define('CSS', $_SERVER['DOCUMENT_ROOT'] . '/css/');
define('IMAGES', $_SERVER['DOCUMENT_ROOT'] . '/images/');
}
else{
define('SITEURL', 'http://' . $_SERVER['HTTP_Host']);
define('SITEPATH', $_SERVER['DOCUMENT_ROOT']);
define('TEMPLATE', $_SERVER['DOCUMENT_ROOT'] . '/incs/template/');
define('CSS', $_SERVER['DOCUMENT_ROOT'] . '/css/');
define('IMAGES', $_SERVER['DOCUMENT_ROOT'] . '/images/');
}