在Fat Free Framework中使用mod_rewrite的简单问题

时间:2011-01-02 02:44:22

标签: php .htaccess mod-rewrite fat-free-framework

我正在尝试设置和学习PHP的Fat Free Framework。 http://fatfree.sourceforge.net/

设置相当简单,我在使用MAMP的机器上运行它。

我能够让'hello world'示例只运行fin:

require_once 'path/to/F3.php';
F3::route('GET /','home');
    function home() {
        echo 'Hello, world!';
    }
F3::run();

但是当我尝试添加第二部分时,它有两条路线:

require_once'F3 / F3.php';

F3::route('GET /','home');
function home() {
    echo 'Hello, world!';
}

F3::route('GET /about','about');
function about()
{
    echo 'About Us.';
}

F3::run();

如果我尝试第二个网址,则会收到404错误:/ about

不确定为什么其中一个mod_rewrite命令会起作用,而不是另一个。

以下是我的.htaccess文件:

# Enable rewrite engine and route requests to framework
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]

# Disable ETags
Header Unset ETag
FileETag none

# Default expires header if none specified (stay in browser cache for 7 days)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A604800
</IfModule>

8 个答案:

答案 0 :(得分:11)

所以我的朋友实际上帮我解决了这个问题。我遇到了完全相同的问题,但基本上我也在使用MAMP并且在MAMP的htdocs中的fatfree目录中拥有我所有的Fat Free文件。

解决方案是您需要修改RewriteBase以指向/[dirname]/而不仅仅是/,然后将RewriteRule更改为/[dirname]/index.php

我的.htaccess看起来像这样:

RewriteEngine On
RewriteBase /fatfree/
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /fatfree/index.php [L,QSA]

在设置之后,您可以完全按照Fat Free文档中的示例进行操作,它将像魅力一样工作。这困扰了我一段时间,这就是它所需要的一切。此外,如果您正在使用MAMP,请编辑httpd.conf中的/Applications/MAMP/conf/apache文件,并确保更改以下内容:

<Directory />
    Options Indexes FollowSymLinks
    AllowOverride None
</Directory>

<Directory />
    Options Indexes FollowSymLinks
    AllowOverride All
</Directory>

基本上将None更改为All

答案 1 :(得分:2)

如果您在子文件夹下运行F3,则必须更改.htaccess中的RewriteBase以匹配该文件夹。

答案 2 :(得分:1)

在你的.htaccess中你有'index.php'它需要一个斜线...'/ index.php'

# Enable rewrite engine and route requests to framework
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-l          
RewriteCond %{REQUEST_FILENAME} !-f          
RewriteCond %{REQUEST_FILENAME} !-d          
RewriteRule .* /index.php [L,QSA]    

否则当它试图重写/ about /时它会查找/about/index.php而不仅仅是根/index.php


我只是想到了另一个想法......有可能是因为mod_rewrite被安装,可能是服务器的怪癖导致它不能重写......

如果下面的全局路线不起作用,您可能需要测试重写

RewriteRule ^/google http://www.google.com [L,NC];

您还可以尝试目录的全局路由

F3::route('GET /about/*','about');

但这意味着在domain.com/about/下的任何内容......任何事情......都会重新路由到about函数......


关于mod_rewrite和FF的说明

正如你所说,FF正在给你一个404,因为它期待'/'而不是'/index.php'......但是,它是index.php,它正在期待差异......

为了证明这一点,我相信你可以复制你的

F3::route('GET /','home');

as

F3::route('GET /index.php','home');

,页面应显示......

这样做的原因是,如果你只是转到/目录(或/index.php)eitehr方式apache servex index.php页面....

mod_rewrite允许你重定向/ about并让它重定向到index.php ..所以如果你的重写规则不起作用,那么重定向/重写不会发生,你会得到一个404 ...

如上所述,使用google规则测试mod_rewrite ..然后尝试转到http://localhost:80/google 如果它没有重定向到谷歌然后你的重写引擎不工作...(可能是Windows配置的问题..)


在windows下启用mod_rewrite: 打开你的http.conf 找到这一行:

#LoadModule rewrite_module modules/mod_rewrite.so

从行中删除注释标记(#)...所以你有: LoadModule rewrite_module modules / mod_rewrite.so 保存文件并重启apache ..

Alternatly ..我想你可以说:

LoadModule rewrite_module modules/mod_rewrite.so

在你的htaccess文件开头......

答案 3 :(得分:1)

我把头撞了两天。我调试了htaccess和php。实际问题是:

如果您从他们的fatfree-1.4.4 zip下载中复制了.htaccess文件,那么 .htaccess htaccess (。缺失)只需将此文件重命名为来自htaccess的.htaccess,一切都会像文档中提到的那样完美地工作!!!

我正在使用此.htaccess也适用于非root文件夹

Options -Indexes 
IndexIgnore *    

RewriteEngine On
RewriteCond $1 !^(index\.php|images|main\.css|form\.css|favicon\.ico|robots\.txt|sitemap\.xml)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

答案 4 :(得分:1)

  

注意:如果要将.htaccess文件调用为其他文件,可以使用AccessFileName指令更改文件名。例如,如果您希望调用文件.config,则可以将以下内容放入服务器配置文件中:

AccessFileName .config  

here

答案 5 :(得分:0)

这个回复可能为时已晚,但我昨天遇到了同样的问题。

听起来问题是apache不会重写网址。我试图在OSX 10.7上运行F3时遇到了同样的问题 - 'GET /'路由可行,但不是'GET /foo',因为F3 index.php在localhost / F3的子目录中。我的解决方案是:

  1. 确保.htaccess已设置为您。
  2. 确保在apache的httpd.conf
  3. 中启用了mod_rewrite.so
  4. 确保为httpd.conf中的web目录设置AllowOverride All(我是无)。(文件的下方)。
  5. 重启apache
  6. 如果没有第3步,apache将忽略任何重写指令。我通过更改本地wordpress安装的永久链接发现了这一点,但是他们失败了,表明问题是apache配置,而不是F3。

答案 6 :(得分:0)

我用MAMP堆栈运行它。 我将他们的文件夹从“fatfree-master”重命名为“f3”。 我把那个文件夹放在htdocs旁边。 他们的.htaccess文件(现在在MAMP / f3 / lib中)保持不变。

我的.htaccess(在我的网络子文件夹中)按照他们的例子是库存标准:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php [L,QSA]

希望这有助于某人。

答案 7 :(得分:0)

我遇到了同样的问题,我通过将 .htaccess 文件移动到 fatfree 项目的根目录来解决它。

在根目录下创建一个带有以下代码的文件.htaccess

# Enable rewrite engine and route requests to framework
RewriteEngine On

# Some servers require you to specify the `RewriteBase` directive
# In such cases, it should be the path (relative to the document root)
# containing this .htaccess file
#
# RewriteBase /

RewriteCond %{REQUEST_URI} \.ini$
RewriteRule \.ini$ - [R=404]

RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]