Как использовать REQUEST_URI вместо REDIRECT_URL с IIS, чтобы получить ту же функциональность?

2

У меня есть приложение PHP с использованием $ _SERVER ['REQUEST_URI']. Если я использую веб-сервер Apache, мое приложение работает нормально. Если я использую веб-сервер Microsoft IIS, приложение не работает, потому что $ _SERVER ['REQUEST_URI'] имеет значение NULL. Я обнаружил, что $ _SERVER ['REDIRECT_URL] доступен в Microsoft IIS.

Мой вопрос заключается в том, как использовать $ _SERVER ['REDIRECT_URL'] вместо $ _SERVER ['REQUEST_URI'], чтобы получить такую же функциональность с помощью веб-сервера Microsoft IIS?

Я не могу просто заменить REQUEST_URI REDIRECT_URL, так как он не содержит строку запроса, и мне это нужно для моего PHP-приложения.

Мой PHP-код:

function filterAppUrl($url)
{  
  $url = htmlspecialchars($url);
  $url = str_replace('"', '',  $url);
  $url = str_replace("'", '',  $url);
  return $url;
}

function setAppURL()
{
   $url = $this->filterAppUrl($_SERVER['REDIRECT_URL']);
   $url = substr($url, 1, strlen($url));
   $this->full_url = $url;
   $this->url = explode('/', $url);
}

Мой.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Мой Web.config для IIS

<?xml version="1.0"?>
<configuration>
 <system.webServer>
 <defaultDocument>
  <files>
    <remove value="index.php" />
    <add value="index.php" />
  </files>
 </defaultDocument>
<rewrite>
 <rules>
     <rule name="Main Rule" stopProcessing="true">
         <match url=".*" />
         <conditions logicalGrouping="MatchAll">
             <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
             <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
         </conditions>
         <action type="Rewrite" url="index.php" />
     </rule>
 </rules>
</rewrite>
</system.webServer>
</configuration>
Теги:
redirect
iis
php-5.3
iis-7.5

3 ответа

1

Что-то вроде:

function setAppURL()
{
   if (isset($_SERVER['REDIRECT_URL'])) {
      $url = $this->filterAppUrl($_SERVER['REDIRECT_URL']);
   } else {
      $url = $this->filterAppUrl($_SERVER['REQUEST_URI']);
   }
   $url = substr($url, 1, strlen($url));
   $this->full_url = $url;
   $this->url = explode('/', $url);
}

В основном это похоже на высказывание: если REDIRECT_URL установлен, а не null, то используйте его. Повторное использование REQUEST_URI.

  • 0
    Нет, это не работает, потому что возвращаемые значения отличаются от REDIRECT_URL и REQUEST_URI. Также я использовал редирект с index.php. Я обновил вопрос с помощью .htaccess и Web.config, чтобы прояснить проблему.
  • 0
    Что ты сказал? REDIRECT_URL и REQUEST_URI оба содержат значения, но вы можете определить, какой из них правильный, проверив сервер, на котором работает скрипт?
Показать ещё 3 комментария
0

У меня также была эта проблема в течение длительного времени, но у меня есть это решение. Это исправит вашу проблему:

<?php
echo parse_url($_SERVER["REQUEST_URI"]);
?>
0

У меня была та же проблема, и хотя точное содержимое массива $ _SERVER, похоже, отличается между различными конфигурациями IIS, это работает для меня на машине Azure.

Я использую этот код, чтобы получить рабочую ссылку на запрошенный URL-адрес без строки запроса, как на Unix, так и на IIS:

        // on unix we just get what we need
        if(isset($_SERVER['REDIRECT_URI'])) {
            $base_uri = $_SERVER['REDIRECT_URI'];
        }
        // IIS doesn't have a nice way to get the request url without the query string,
        // so grab the request uri until the start of the query string
        else {
            $base_uri = substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], '?'));
        }

Для URL-адреса, такого как http://www.example.com/path/to/page?article=123, $ base_uri будет как на Unix, так и на IIS,/path/to/page.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню