【问题标题】:Slim framework - cannot interpret routes with dotSlim 框架 - 无法用点解释路由
【发布时间】:2014-08-11 18:28:25
【问题描述】:

问题陈述

我目前正在开发一个内部 RESTful API,并且我正在使用我们的主域名作为环境标识符。但是,我注意到 Slim 根本不喜欢在其中有 dot 的路线。

示例案例

我有一个使用 PHP 的内置网络服务器运行的本地网络服务器,我调用了 php -S 0.0.0.0:5000 来让它运行。

一旦网络服务器启动,我在索引页面上有一个简单的“hello world”。一切正常,花花公子。

然后我设置如下路线:

$app->get('/:domain/:id', function($domain, $id) 
{
    echo $domain . ' ' . $id;
} 

有了这个,我设置了希望解析0.0.0.0:5000/apple.com/juicers的路由。我尝试使用0.0.0.0:5000/apple/juicers,页面打印出苹果榨汁机。但是使用0.0.0.0:5000/apple.com/juicers,我得到一个 404 Not Found 错误。

到目前为止我已经尝试过什么

网址重写

我在 Google 以及 Slim 框架的 Github 问题上查找了可用资源。好像有人遇到过类似的问题:https://github.com/codeguy/Slim/issues/359

该票中建议的解决方案是:URL 重写修复。我试过了,但没有用。我在项目目录的根目录下设置了.htaccess,并在我的Mac 的httpd.conf 文件中打开了AllowOverRide All

php -S 0.0.0.0:5000 index.php

我没有单独运行php -S 0.0.0.0:5000,而是在index.php 上运行命令。此时,slim 框架没有抛出 Not Found 错误,而是解析到我的基本路由,我设置如下:

$app->get('/', function() { echo "hello world"; });

谢谢

我已经无能为力了,我们将不胜感激任何帮助。非常感谢您的阅读!

【问题讨论】:

    标签: php apache .htaccess frameworks slim


    【解决方案1】:

    我会尝试瘦身的Route Conditions。你应该能够指定这样的东西来允许你的参数中的点:

    $app->get('/:domain/:id', function($domain, $id) {
        echo $domain . ' ' . $id;
    })->conditions(array('domain' => '[a-zA-Z\.]+'));
    

    如果这不起作用,您应该考虑使用另一个字符而不是点将域名与 TLD 分开,然后在函数中替换它:

    $app->get('/:domain/:id', function($domain, $id) {
        $domain = str_replace('_', '.', $domain);
        echo $domain . ' ' . $id;
    })->conditions(array('domain' => '[a-zA-Z_]+'));
    

    它不是那么优雅,但它确实有效。

    【讨论】:

    • 我输入了你上面的那个,这是我浏览0.0.0.0:5000/campaigns/hello.com时收到的结果:The requested resource /campaigns/hello.com was not found on this server.
    • 那你错过了指定id?像这样:0.0.0.0:5000/campaigns/hello.com/1
    • 那也没用。仍然有同样的错误:The requested resource /campaigns/hello.com/1 was not found on this server.
    • 我已经更新了答案,因为代码没有编译。另外我已经设置了一个测试项目,你是对的,路线条件不起作用。我认为我们可以将其视为框架的限制甚至是错误。顺便说一句,SO上有一个重复的问题:stackoverflow.com/questions/18362793/…
    【解决方案2】:

    根本问题 - PHP 开发服务器

    在玩过不同的 Slim 条件和实验后,我开始更仔细地研究服务器级别,并确保 URL 正确传递给 Slim 路由。

    原来这是 PHP 开发服务器的问题,可通过 php -S 命令获得。

    通过谷歌快速搜索发现,其他几个人也遇到了同样的问题,这是服务器问题,而不是 Slim 中的错误。

    解决方案

    为了测试我的解决方案,我运行了 MAMP,并传输了我的所有文件。然后我编写了 .htaccess 将所有请求重定向到 index.php。

    关键时刻:

    我输入localhost:8888/campaigns/demo.com/12,当我看到浏览器上写着一行美丽、华丽的demo.com/12 时,一阵喜悦涌上我的心头! (我有一条echo 针对那条特定路线的声明)一周多的故障排除和修补终于取得了成果!

    庆祝万岁!

    \(^O^)/阿帕奇的万岁!

    感谢您的帮助@adosaiguas!

    【讨论】:

    • 那么问题出在php中的嵌入式Web服务器上?在 apache 中,它需要条件还是立即工作?
    【解决方案3】:

    Slim 依赖于$_SERVER['SCRIPT_NAME'],它应该是路由文件(Apache 的 DirectoryIndex,以及 Rewrite 指向的文件。下面的示例中假设为 index.php)。

    在 PHP 嵌入式服务器中,如果 URI 在文件部分包含点,则 PHP 不会正确定位 SCRIPT_NAME 值。

    您可以使用以下调整来模仿 RewriteRule 行为:

    创建一个router.php 文件并使用您的 PHP 嵌入式服务器通过它发送所有请求:

    $_SERVER['SCRIPT_NAME'] = 'index.php';
    include 'index.php';
    

    然后,启动 PHP 嵌入式服务器:

    php -S 0.0.0.0:<port> -t <your-Http-document-root> router.php
    

    router.php 文件不会在您的生产环境中使用。只有 PHP 嵌入式服务器使用它,它应该可以解决您的“带点的路由”问题。

    【讨论】:

    【解决方案4】:

    我刚刚将它添加到路由器脚本的顶部(在我的例子中是 index.php):

    if (PHP_SAPI === 'cli-server') {
      $_SERVER['SCRIPT_NAME'] = pathinfo(__FILE__, PATHINFO_BASENAME);
    }
    

    使用示例:

    $ php -S localhost:8080 -t public index.php
    

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 2013-04-06
      • 2014-08-27
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多