1

Toro 文档显示:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L]

但我尝试了很多次和不同的方式,但是,不起作用......经过大量搜索,我发现了这个(来源):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php?$1 [L]

只需要改变RewriteRule ^(.*)$ /index.php/$1 [L] to /?得到这个RewriteRule ^(.*)$ /index.php?$1 [L]

有人知道为什么原来的不起作用,或者有不同的方法吗?

更多信息 主机:php5.4 fastcgi,共享主机,公司 Dreamhost。只需接受 SCRIPT_NAME 而不是 PATH_INFO

处理它的 Toro 代码是:

$path_info = '/';
        if (!empty($_SERVER['PATH_INFO'])) {
            $path_info = $_SERVER['PATH_INFO'];
        }
        else if (!empty($_SERVER['ORIG_PATH_INFO']) && $_SERVER['ORIG_PATH_INFO'] !== '/index.php') {
            $path_info = $_SERVER['ORIG_PATH_INFO'];
        }
        else {
            if (!empty($_SERVER['REQUEST_URI'])) {
         $path_info = (strpos($_SERVER['REQUEST_URI'], '?') > 0) ? strstr($_SERVER['REQUEST_URI'], '?', true) : $_SERVER['REQUEST_URI'];
                }
        }
4

2 回答 2

1

这就是将 URL 映射到生成响应的脚本的路径。

Apache 获取 HTTP 请求,其中包含一个 URL,特别是其中的路径和查询字符串部分。Mod_rewrite 使用来自服务器配置的规则重写 URL(多个文件:apache2.conf、httpd.conf、虚拟主机配置、.htaccess,...)。然后 Apache 将其拆分为第一个问号并将路径部分解释为文件系统路径(带有 DocumentRoot 前缀)。如果文件不存在,通常会生成 404 Not Found 响应。如果是图像或 HTML 文档,则按原样发送。如果它是一个脚本,它会被执行并以某种方式从请求中获取查询字符串和其他信息。

我不能说得很具体,因为 Apache 是非常模块化和可配置的。尤其是脚本执行是一个相当复杂的话题。Apache 工作的一般部分是请求解析 → URL 到文件系统路径映射 → 响应生成。

客户端可见的 URL 可以根本不包含问号,并且仍然可以执行脚本并从 URL 中获得一些额外的信息。一种方法是使用 mod_rewrite 和 .htaccess 重写 URL,其中/被重写为? . 正如 Jon Lin 已经写过的,AcceptPathInfo 是另一种选择。我不确定它们中的任何一个对于您的需求是否明显更好或更坏。在大型服务器上使用时,性能可能会成为一个问题,但这不是您的情况。

于 2013-09-19T16:41:05.670 回答
0

您可能在不支持 cgi 的 PATH_INFO 样式的服务器上运行。这是脚本本身所在的位置/index.php,“PATH_INFO”是它后面的路径名。查看AcceptPathInfo文档:

该指令控制是否接受或拒绝包含跟随实际文件名(或现有目录中不存在的文件)的尾随路径名信息的请求。尾随路径名信息可用于PATH_INFO环境变量中的脚本。

例如,假设位置/test/指向仅包含单个文件的目录here.html。然后请求/test/here.html/more/test/nothere.html/more都收集/morePATH_INFO

AcceptPathInfo指令的主要目的是允许您覆盖处理程序对接受或拒绝的选择PATH_INFO。例如,当您使用过滤器(如INCLUDES)生成基于 的内容时,需要此覆盖PATH_INFO。核心处理程序通常会拒绝请求,因此您可以使用以下配置来启用这样的脚本:

<Files "mypaths.shtml">
Options +Includes
SetOutputFilter INCLUDES
AcceptPathInfo On
</Files> 

因此,您可以尝试打开AcceptPathInfo“打开”,看看是否有帮助。

于 2013-09-19T16:10:05.637 回答