2014-10-05 2 views
1

Мое приложение PHP не работает из-за $ _SERVER ['REQUEST_URI'] возвращает полный URL-адрес скрипту вместо относительного пути.

My environment:
Windows 7 64 bit.
XAMPP Version 1.8.2
PHP Version 5.4.16
Apache версии Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.16

Мой виртуальный хост Conf:

<VirtualHost *:80> 
DocumentRoot "D:/HTDOCS/ivankristianto" 
ServerName www.ivankristianto.local 
UseCanonicalName Off 
<Directory "D:/HTDOCS/ivankristianto"> 
    Options Indexes FollowSymLinks MultiViews 
    AllowOverride all 
    Require all granted 
</Directory> 
</VirtualHost> 

Я создал базовый сценарий для тестирования содержимого $ _SERVER:

echo '$_SERVER[\'HTTP_HOST\'] : ' . $_SERVER['HTTP_HOST']; 
echo '<br/>' . '$_SERVER[\'PHP_SELF\'] : ' . $_SERVER['PHP_SELF']; 
echo '<br/>' . '$_SERVER[\'REQUEST_URI\'] : ' . $_SERVER['REQUEST_URI']; 

И вот результат:

// URL: http://localhost/ivankristianto/request.php 
$_SERVER['HTTP_HOST'] : localhost 
$_SERVER['PHP_SELF'] : /ivankristianto/request.php 
$_SERVER['REQUEST_URI'] : /ivankristianto/request.php //This is correct 

И

// URL: http://www.ivankristianto.local/request.php 
$_SERVER['HTTP_HOST'] : www.ivankristianto.local 
$_SERVER['PHP_SELF'] : /request.php 
$_SERVER['REQUEST_URI'] : http://www.ivankristianto.local/request.php //This is wrong 

Я не использовал прокси-сервер, все, что я сделал это просто установить его в моих/и т.д./хостов.

Я потратил часы, чтобы узнать, почему это происходит, и были поиски через Google и этот сайт, но не могут найти подсказки.

Не могли бы вы указать, что случилось?

Спасибо.
Иван

ответ

0

Я, наконец, получил его работу.
Вот шаги, которые я сделал (я не знаю, почему это происходит, но теперь оно работает).

  1. Установка PHP FastCGI на XAMPP, я следовать этим шагам: https://commaster.net/content/installing-php-fastcgi-and-zend-opcache-xampp-windows
  2. я загружаю mod_fcgid, но я не использую PHP-cgi.exe обработчик
  3. обновление моей/и т.д./файл хостов и флеш DNS с этой командой Ipconfig/flushdns
  4. Перезапустите Apache

И это работает так или иначе.
Честно говоря, я не знаю, почему он работает, но если кто-то споткнет ту же проблему, я надеюсь, что решение может помочь.

3

Я считаю, что вы получаете желаемый эффект создания виртуального хоста:

Нет Virtual Host:

/ivankristianto/request.php 

С Виртуальный хост:

http://www.ivankristianto.local/request.php 

http://www.ivankristianto.local - I подумайте, что это кажется вам неправильным, потому что оно содержит http://www и .local - вы можете изменить это на invankristano, и ваш REQUEST_URI будет выводить то же, что и у вас не было виртуального хоста. Он представляет путь к вашему request.php - который вы установили в файле hosts и, следовательно, является действительной частью URI.

Так что в основном я говорю, что нет ничего плохого.

Если это вызывает проблемы, тогда одно решение будет определять, в какой среде вы находитесь - e.G

if($_SERVER['HTTP_HOST'] == 'www.ivankristianto.local') { 
    $dev_env = TRUE; 
}else { 
    $dev_env = FALSE; 
} 

затем где-то использовать, что:

if($dev_env) { 
    $_SERVER['REQUEST_URI'] = str_replace($_SERVER['HTTP_HOST'],'',$_SERVER['REQUEST_URI']); 
} 

обновление

попробуйте изменить хост-конф в:

<VirtualHost *:80> 
DocumentRoot "D:/HTDOCS/ivankristianto" 
ServerName ivankristianto.local 
UseCanonicalName Off 
<Directory "D:/HTDOCS/ivankristianto"> 
    Options Indexes FollowSymLinks MultiViews 
    AllowOverride all 
    Require all granted 
</Directory> 
</VirtualHost> 

(. удалить WWW из ServerName)

+0

Спасибо JohnnyFaldo за ваш ответ. Но REQUEST_URI не должен возвращать полный URL-адрес, он должен вернуться к чему-то вроде этого: '/request.php'. На основе PHP Doc: http://php.net/manual/en/reserved.variables.server.php – Ivan

+0

Это то, что он делает. Это моя точка зрения - вы смущены синтаксисом «URL» вашего виртуального хоста - если вы изменили его в файлах хоста только на «ivankristianto» без www. &. local - тогда это будет казаться менее странным. Это просто имя, которое ссылается на фактическую часть URI, которую он представляет, заданный в файле hosts – JohnnyFaldo

+0

@ Ивана вы пытались избавиться от строки UseCanonicalName в файле hosts – JohnnyFaldo

0

Если бы один и тот же вопрос в последнее время,
Мое решение:.
Во-первых, проверьте, если ваша http://localhost имеет тот же эффект (что я вижу, я не сделал)
Если нет, то добавил виртуального хоста (домены) в файл/etc/host.

Надеюсь, это полезно.