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

У меня есть приложение PHP с использованием $ _SERVER [ ‘REQUEST_URI’]. Если я использую веб-сервер Apache, мое приложение работает нормально. Если я использую веб-сервер Microsoft IIS, приложение не работает, потому что $ _SERVER [ ‘REQUEST_URI’] нулевой. я нашел это $ _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>

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 установлен и не ноль, то используйте его. Остальное использовать REQUEST_URI,

1

Другие решения

У меня была та же проблема, и хотя точное содержимое массива $ _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, / Путь / к / страница.

0

По вопросам рекламы [email protected]