Я переместил установку WordPress в новую папку на сервере Windows / IIS . Я настраиваю 301 редирект в PHP, но похоже, что это не работает. URL-адреса моих сообщений имеют следующий формат:
http:://www.example.com/OLD_FOLDER/index.php/post-title/
Я не могу понять, как получить /post-title/
часть URL.
$_SERVER["REQUEST_URI"]
- который, кажется, все рекомендуют - возвращает пустую строку. $_SERVER["PHP_SELF"]
просто возвращается index.php
. Почему это так и как это исправить?
Ответы:
Возможно, потому что вы находитесь под IIS,
$_SERVER['PATH_INFO']
это то, что вы хотите, на основе URL-адресов, которые вы использовали для объяснения.
Для Apache вы должны использовать
$_SERVER['REQUEST_URI']
.источник
Notice: Undefined index: PATH_INFO in /home/tdpk/public_html/system/config.php on line 14
$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;
источник
Для Apache:
'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']
Устанавливается на основе заголовков запроса. Если сервер отвечает на любые / все доменные имена на этом IP-адресе, пользователь может подделать заголовок или, что еще хуже, кто-то может указать DNS-запись на ваш IP-адрес, и тогда ваш сервер / веб-сайт будет обслуживать веб-сайт с динамическим ссылки построены на неправильном 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
Надеюсь, это поможет. Настоящая цель этого ответа заключалась в том, чтобы просто предоставить первую строку кода для тех людей, которые оказались здесь, когда искали способ получить полный URL-адрес с помощью apache :)
источник
$_SERVER['HTTP_HOST']
вместо$_SERVER['SERVER_NAME']
. Если настроен виртуальный хост, SERVER_NAME покажет это имя. Это может быть что-то вроде*.example.com
недопустимого.$_SERVER['REQUEST_URI']
не работает в IIS, но я нашел это: http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/, что звучит многообещающе.источник
Используйте этот класс, чтобы заставить 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;
источник
Добавить:
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
функцию.источник
Я использую следующую функцию, чтобы получить текущий полный URL. Это должно работать в IIS и Apache.
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; }
источник
$query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';
. Я обновил ваш ответ, включив это.REQUEST_URI устанавливается Apache, поэтому вы не получите его с IIS. Попробуйте выполнить var_dump или print_r на $ _SERVER и посмотрите, какие там существуют значения, которые вы можете использовать.
источник
Часть заголовка URL-адреса находится после вашего
index.php
файла, что является обычным способом предоставления удобных URL-адресов без использования mod_rewrite. Таким образом, заголовок на самом деле является частью строки запроса, поэтому вы можете получить его с помощью $ _SERVER ['QUERY_STRING']источник
Используйте следующую строку в верхней части страницы PHP, на которой вы используете
$_SERVER['REQUEST_URI']
. Это решит вашу проблему.$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
источник
О, удовольствие от сниппета!
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/" // }
источник
Все забыли http_build_url ?
http_build_url($_SERVER['REQUEST_URI']);
Если параметры не переданы,
http_build_url
он автоматически принимает текущий URL. Я ожидалREQUEST_URI
включат, хотя, похоже, это необходимо для включения параметров GET.В приведенном выше примере будет возвращен полный URL.
источник
Я использовал следующий код и получаю правильный результат ...
<?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(); ?>
источник
На моем сервере apache это дает мне полный URL-адрес в точном формате, который вы ищете:
$_SERVER["SCRIPT_URI"]
источник
Поддержка обратного прокси!
Что-нибудь посильнее. Примечание. Работает только на
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'])), '/')); }
источник