【问题标题】:How to use REQUEST_URI instead of REDIRECT_URL with IIS to get same functionality?如何在 IIS 中使用 REQUEST_URI 而不是 REDIRECT_URL 来获得相同的功能?
【发布时间】:2016-01-06 05:22:08
【问题描述】:

我有一个使用 $_SERVER['REQUEST_URI'] 的 PHP 应用程序。如果我使用 Apache Web 服务器,我的应用程序运行良好。如果我使用 Microsoft IIS 网络服务器 App 不工作,因为 $_SERVER['REQUEST_URI'] 为空。我发现 $_SERVER['REDIRECT_URL'] 可用于 Microsoft IIS。

我的问题是如何使用 $_SERVER['REDIRECT_URL'] 而不是 $_SERVER['REQUEST_URI'] 来使用 Microsoft IIS Web 服务器获得相同的功能?

我不能简单地将 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>

我的 IIS 的 Web.config

<?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>

【问题讨论】:

    标签: php redirect iis iis-7.5 php-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 已设置且不为空,则使用它。否则使用REQUEST_URI

    【讨论】:

    • 不,它不起作用,因为返回值与 REDIRECT_URL 和 REQUEST_URI 不同。我还使用了 index.php 的重定向。我用我的 .htaccess 和 Web.config 更新了问题,以明确问题。
    • 你在说什么? REDIRECT_URL 和 REQUEST_URI 都包含值,但是只能通过检查脚本运行所在的服务器来确定哪个是正确的?
    • 我读到:“请注意,REDIRECT_URL 只包含 URI 路径。” stackoverflow.com/questions/6483912/…我试过你的代码,但应用程序不能像 apache 服务器那样工作。
    • 如果我使用您的代码,当我的 URL 包含类似 mydomain/path/item?id=1 的 queryString 时遇到问题
    • @DmitryKazakov 我明白了。我只是澄清了你的问题,指出你需要查询字符串,这并不明显(至少对我来说不是)。请制作一个调用phpinfo(); 的脚本,运行它并检查所有可用的变量。也许这可以帮助您找到合适的变量。
    【解决方案2】:

    我遇到了同样的问题,尽管 $_SERVER 数组的确切内容在不同的 IIS 配置之间似乎有所不同,但这对我在 Azure 机器上有效。

    我使用此代码在 Unix 和 IIS 上获取对所请求 URL 的工作引用,而无需查询字符串:

            // 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'], '?'));
            }
    

    对于像http://www.example.com/path/to/page?article=123 这样的网址,$base_uri 在 Unix 和 IIS 上都是 /path/to/page

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2014-04-03
      • 2021-05-21
      • 2021-12-17
      相关资源
      最近更新 更多