1

我正在尝试使用 Apache 的 mod_rewrite 来创建更好的 URL。我将所有内容重定向到单个 index.php 页面,解析 $_SERVER['REQUEST_URI'] 然后包含适当的页面。

RewriteRule 的代码如下:

Options +FollowSymLinks
RewriteEngine on
RewriteRule \b.*\b index.php

我做了一个 url 类来处理 url 操作,里面有这个函数来获取 URL:

public function get_url(){
    $url = strtolower($_SERVER['REQUEST_URI']);
    $url = explode("/", $url);
    array_shift($url);
    print_r($url);
    return $url;
}

它可以工作,但是有一个问题:当有 / 字符时,explode 函数会导致最后一个数组索引为空,这让我很困扰,并且在包含正确的页面时使事情变得更加复杂。这应该很容易解决,进行一些廉价的操作,例如:

$url = trim(str_replace(" ", "/", $url));
$url = explode(" ", $url);      

但是,每当我尝试以除上面所写之外的任何方式更改 $url 变量(它是 $_SERVER['REQUEST_URI'] 的副本)时,都会收到此错误:

页面未正确重定向

Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。

此问题有时可能是由禁用或拒绝接受 cookie 引起的。

我的猜测是 $_SERVER['REQUEST_URI'] 以某种方式通过引用传递,当我尝试操作字符串时,Apache 服务器找不到匹配项并且变得很糟糕,但我不知道为什么会发生这种情况(或者为什么用 / 分隔符爆炸是可以的,但将 / 字符更改为空格然后爆炸不是),或者更重要的是,如何修复它。

4

1 回答 1

0

您遇到的问题根本与您的 PHP 无关。

您只需告诉 apache 一次又一次地重写该请求,这将导致您发布的 Firefox 声明。

为了避免在 index.php 已经解决时重写,您必须添加一个条件:

RewriteCond %{REQUEST_URI} ^!(index\.php.*)
RewriteRule \b.*\b index.php

这样,该规则仅适用于 URI 不以“index.php”开头并且因此尚未被重写的情况

问候,

斯蒂芬

于 2012-05-03T10:33:47.343 回答