Drush status:hook_init()中drupal_goto()导致的不可恢复的错误

时间:2011-07-26 04:27:01

标签: drupal drupal-6 drush

我有一个带有drupal_goto()的模块,如果用户没有通过hook_init()中的年龄要求(wine网站),则重定向用户。模块设置较重,因此最后加载。

在PHP 5.3上,drush更新失败。运行PHP 5.2的不同服务器上的相同代码和数据库运行正常。

Drush版本:7.x-4.4 PHP版本:5.3示例:

当我跑:drush status时,我收到一个错误。这是带有debug和verbose标志的输出。

$ drush -d -v status
Bootstrap to phase 0. [0.02 sec, 2.47 MB]                            [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drush() [0.03 sec, 2.67 MB] [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drupal_root() [0.06 sec, 5.49 MB]                                              [bootstrap]
Initialized Drupal 6.22 root directory at /var/www/example.com/public_html [0.07 sec, 6.28 MB]                         [notice]
Drush bootstrap phase : _drush_bootstrap_drupal_site() [0.07 sec, 6.29 MB]                                              [bootstrap]
Initialized Drupal site default at sites/default [0.07 sec, 6.29 MB]                                                       [notice]
Drush bootstrap phase : _drush_bootstrap_drupal_configuration() [0.08 sec, 6.29 MB]                                     [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drupal_database() [0.08 sec, 6.33 MB]                                          [bootstrap]
Successfully connected to the Drupal database. [0.08 sec, 6.33 MB]                                                      [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drupal_full() [0.09 sec, 6.67 MB]                                              [bootstrap]
Drush command terminated abnormally due to an unrecoverable error. [0.34 sec, 31.38 MB]                                 [error]

现在的问题是:为什么drupal_goto()会导致PHP 5.3服务器上的drush失败而不是PHP 5.2服务器。

1 个答案:

答案 0 :(得分:0)

如果拒绝访问,则不应发出重定向。这是任何Web框架中的逻辑错误。如果要拒绝访问,则应发出“拒绝访问”。就像你发布了“内容已移动到那里,请转到那里”,当你的内容移动时。

而不是drupal_goto(),请使用drupal_access_denied()。如果您确实希望将人们重定向到其他网址,那么在显示拒绝访问权限的网页上会显示

也就是说,发出drupal_access_denied(),或者实际上在hook_init()中发送任何标头是完全错误的。从documentation:«执行设置任务。»发送标题设置任务。此外,相同的文档警告您的方法的另一个潜在问题:«此挂钩不在缓存页面上运行»,换句话说,一旦成人访问页面,并且它被缓存,未成年访问者将不会被重定向或拒绝访问,他们将获得缓存页面。

现在,您做什么: 可以使用诸如Taxonomy Access(Lite)之类的模块或更合适的Node Privacy By Role来授予对您的内容的访问权限。请注意,默认情况下,视图不会使用这些访问权限:它们将显示内容列表,无论用户是否访问:您必须重新配置所有视图以遵守访问规则或完全不可访问,某些角色。 此外,你需要给“未成年人”一个单独的角色:这样你就可以授予他们与rol“认证用户”甚至“成人”中的人不同的访问权限。您需要一些机制automatically assign roles