我一直在
下运行一个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
答案 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
配置,但相反的情况可能会发生 - 根路线不起作用而其他路线不起作用,所以需要一些这里更多的诡计...)