操作webroot未在控制器AppController中定义

时间:2016-09-04 12:48:29

标签: cakephp-2.3

我一直在

下运行一个cakephp应用程序

www.lernzentrum.de/kundenservice

超过两年,一切正常。现在突然没有任何改变,我的方面出错了:任何登录都会导致错误:

"操作webroot未在控制器AppController"

中定义

您可以在我的网站上自行尝试。它看起来像一个路由错误,所以我给我的.htaccess文件:

at /kundenservice/app/webroot/.htaccess:

<IfModule mod_rewrite.c>
     RewriteEngine On
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

at /kundenservice/.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$ app/webroot/    [L]
    RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

at /kundenservice/app/.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>

这是error.log的一部分:

2016-08-30 14:42:46 Error: [MethodNotAllowedException] Method Not Allowed
Request URL: /kundenservice/lessons/spenden/6674
Stack Trace:
#0 [internal function]: LessonsController->spenden('6674')
#1 /mnt/web4/c3/63/51573863/htdocs/kundenservice/lib/Cake/Controller/Controller.php(486): ReflectionMethod->invokeArgs(Object(LessonsController), Array)
#2 /mnt/web4/c3/63/51573863/htdocs/kundenservice/lib/Cake/Routing/Dispatcher.php(187): Controller->invokeAction(Object(CakeRequest))
#3 /mnt/web4/c3/63/51573863/htdocs/kundenservice/lib/Cake/Routing/Dispatcher.php(162): Dispatcher->_invoke(Object(LessonsController), Object(CakeRequest), Object(CakeResponse))
#4 /mnt/web4/c3/63/51573863/htdocs/kundenservice/app/webroot/index.php(109): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#5 {main}

---这是应用程序在按预期工作时抛出的异常! ---以下是蓝天中出现的神秘新错误:

2016-08-31 19:20:25 Error: [MissingActionException]
Action AppController::webroot() could not be found.
Exception Attributes: array (
  'controller' => 'AppController',
  'action' => 'webroot',
)
Request URL: /kundenservice/app/webroot/service/cron
Stack Trace:
#0 /mnt/web4/c3/63/51573863/htdocs/kundenservice/lib/Cake/Routing/Dispatcher.php(187): Controller->invokeAction(Object(CakeRequest))
#1 /mnt/web4/c3/63/51573863/htdocs/kundenservice/lib/Cake/Routing/Dispatcher.php(162): Dispatcher->_invoke(Object(AppController), Object(CakeRequest), Object(CakeResponse))
#2 /mnt/web4/c3/63/51573863/htdocs/kundenservice/app/webroot/index.php(109): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#3 {main}

请求网址不应包含/ app / webroot。

服务器在Strato power web包上运行,因此我无法访问httpd.conf。任何帮助将非常感激。如果有人想通过电话给我支持(电话号码在我的网站上),我很乐意为此付费。

最好的问候,Wilhelm

1 个答案:

答案 0 :(得分:1)

我有一个解决方法,但我知道它不是一个好的,真实的解决方案。

显然,此问题的根源是$_SERVER['REQUEST_URI']包含重定向形式的网址(例如/kundenservice/app/webroot/users/forgot而不是/kundenservice/users/forgot)。但这仅适用于/以外的路由 - 根页面有效。原因是显然RewriteRule中的/kundenservice/app/webroot/.htaccess导致了此行为 - 并且只有当URL没有指向现有文件或目录时才会激活,并且/被定向到/index.php并且该文件存在,在这种情况下问题不会出现。

在互联网上搜索时,我只发现人们反其道而行:如何通过重写修改$_SERVER['REQUEST_URI']? - 答案是它不应该被完成而且不可能(除非你使用[P]或手动更改变量)。

问题似乎已经开始了,可能是由于Strato的某种版本的配置更新 - 在我的本地机器上,当使用XAMPP测试相同的场景时,一切都按预期工作。

我无法找到解决此问题根源的解决方案。但是,我能够找到CakePHP特定问题的解决方法 - 也就是说,我只是从相关的app/webroot变量中删除了令人困惑的$_SERVER部分,然后才能看到它们。

.../app/webroot/index.php中,直接在<?php下添加以下行:

// Workaround for weird .htaccess rewriting problem
// Whenever both the rule in /.htaccess and /app/webroot/.htaccess are active,
// for some reason the actual URLs sent to PHP are modified (they shouldn't be).
$_SERVER['REQUEST_URI'] = str_replace('/app/webroot/', '/', $_SERVER['REQUEST_URI']);
$_SERVER['SCRIPT_URI'] = str_replace('/app/webroot/', '/', $_SERVER['SCRIPT_URI']);
$_SERVER['SCRIPT_URL'] = str_replace('/app/webroot/', '/', $_SERVER['SCRIPT_URL']); 

如上所述,我知道这不是解决根本原因而且它是一个丑陋的解决方案,但它现在有效。

(另一种方式可能是在baseUrl中使用config/core.php配置,但相反的情况可能会发生 - 根路线不起作用而其他路线不起作用,所以需要一些这里更多的诡计...)