【问题标题】:Simple problem with mod_rewrite in the Fat Free FrameworkFat Free Framework 中 mod_rewrite 的简单问题
【发布时间】:2011-06-02 09:19:08
【问题描述】:

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

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

我能够让“hello world”示例运行正常:

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();

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

不确定为什么 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>

【问题讨论】:

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


【解决方案1】:

我遇到了同样的问题,我通过将 .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]

【讨论】:

    【解决方案2】:

    我正在使用 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]
    

    希望这对某人有所帮助。

    【讨论】:

    • 目前还不清楚,至少对我来说,这与问题有何关系。能详细点吗?
    • @Alex 我只会回复一次。我发现这篇文章是因为我无法让他们的样本正常工作,正如上面令人尴尬的解释(尽管如果他们包含标签可能会有用,但我的错)。接下来,在他们的指南中,并不总是很清楚他们指的是哪个 .htaccess 文件。所以我也清除了。最后,他们没有提供 MAMP/XAMP 特定指令。因此,我觉得建议我如何部署他们的框架很有帮助。
    【解决方案3】:

    此回复对您来说可能为时已晚,但我昨天遇到了同样的问题。

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

    1. 确保 .htaccess 已按照您的设置进行设置。
    2. 确保在 apache 的 httpd.conf 中启用了 mod_rewrite.so
    3. 确保您在 httpd.conf(文件下方)中为您的 Web 目录设置了 AllowOverride All(我的是 None)。
    4. 重启apache

    如果没有第 3 步,apache 将忽略任何重写指令。我通过更改本地 wordpress 安装上的永久链接发现了这一点,但它们未能表明问题是 apache 配置,而不是 F3。

    【讨论】:

      【解决方案4】:

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

      解决方案是您需要修改 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,请编辑 /Applications/MAMP/conf/apache 中的 httpd.conf 文件并确保更改以下内容:

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

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

      基本上把None改成All

      【讨论】:

      • 谢谢我尝试了所有这些但仍然没有运气。 / 有效但无效 /anything
      • 帮我解决了这个问题。非常感谢。 [code] RewriteEngine On RewriteBase /fatfree/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* /fatfree/index.php [L,QSA] [/code] [code] require_once '/app /fatfree-2.0.0/lib/base.php'; F3::route('GET /','home'); function home() { echo '你好,世界!'; F3::run(); [/code]
      • 感谢我无法使其工作转移到另一个框架
      • @Geomorillo 我认为您的文件夹和文件权限和所有者有问题。确保所有者是 www-data:www-data 并且所有文件夹都有 755 并且所有文件都有 644 权限
      • 实际上我继续前进并制作了自己的 mvc 框架,但我很确定我检查了文件夹权限并且它们没问题
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        AccessFileName .config  
        

        here

        【讨论】:

          【解决方案7】:

          我为此苦恼了 2 天。我调试了htaccess和php。实际问题是这样的:

          如果您从他们的 fatfree-1.4.4 zip 下载中复制了 .htaccess 文件,则它不是 .htaccess 它的 htaccess(. 丢失)只需将此文件重命名为来自 htaccess 的 .htaccess ,一切都会像文档中提到的那样完美运行!!!

          我正在使用这个 .htaccess 也适用于非根文件夹

          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]
          

          【讨论】:

          • 我正在使用 MAMP,您无法在 Mac OS 上以 . 开头文件名,尝试了您的 .htaccess 但没有运气。
          • 那么,你可以使用.htaccess 吗?没有 htaccess 这个东西是行不通的。也从未在mac上工作过,所以在这里帮不上忙:(
          • 打开终端,cd到htaccess所在的目录,输入mv htaccess .htaccess
          【解决方案8】:

          在您的 .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');
          

          作为

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

          页面应该会显示...

          这样做的原因是如果你只是去/目录(或/index.php)eitehr方式apache服务x 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..

          或者..我想你可以说:

          LoadModule rewrite_module modules/mod_rewrite.so
          

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

          【讨论】:

          • 您用来访问的地址是什么? domain.com/about/index.php 或 domain.com/about 或 ?
          • 也是您的确切 htaccess 文件还是您正在使用
          • 另外:您是否检查了手册所涵盖的路径/路线信息:fatfree.sourceforge.net(标题为:无法运行示例?)
          • Im 使用http://localhost:80/about 来处理路线... / 有效,但 /about 无效,我的文件位于根目录中。是的,这就是我的确切 .htacess
          • 如果我去http://localhost:80/index.php I get a 404` 因为index.php 期望//about 但是只有/ 有效..
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多