Google App Engine "解析./app.yaml时出错:未知的URL处理类型

10 投票
4 回答
8425 浏览
提问于 2025-04-18 18:13

我正在按照一个教程,在Google App Engine上安装PHPMyAdmin。我完全按照步骤操作,但在推送应用时遇到了一个解析错误。这个教程的链接是:https://gae-php-tips.appspot.com/2013/05/26/setting-up-phpmyadmin-on-app-engine/

我在StackOverflow上搜索了一下,发现有一些人遇到了同样的错误,几乎每个人都提到是缩进问题导致的。但我检查了我的文件好几遍,发现app.yaml文件里没有任何缩进问题。

这是我的app.yaml文件:

application: phpmyadmin2121
version: phpmyadmin
runtime: php
api_version: 1

handlers:
- url: /(.*\.(ico$|jpg$|png$|gif$))
static_files: phpMyAdmin/\1
upload: phpMyAdmin/(.*\.(ico$|jpg$|png$|gif$))
application_readable: true

- url: /(.*\.(htm$|html$|css$|js$))
static_files: phpMyAdmin/\1
upload: phpMyAdmin/(.*\.(htm$|html$|css$|js$))
application_readable: true

- url: /(.*\.(php$))
script: phpMyAdmin/\1
secure: always
login: admin

- url: /(.+)
script: phpMyAdmin/index.php
secure: always
login: admin

- url: /
script: phpMyAdmin/index.php
secure: always
login: admin

这里是显示错误的命令行提示:

Michaels-MacBook-Air:phpMyAdmin Mike$ appcfg.py -R -A phpmyadmin2121 -V phpmyadmin update .
用法:appcfg.py [选项] update | [文件, ...]

appcfg.py: error: Error parsing ./app.yaml: Unknown url handler type.
<URLMap 
    secure=default 
    static_files=None 
    application_readable=None 
    auth_fail_action=redirect 
    require_matching_file=None 
    static_dir=None 
    redirect_http_response_code=None 
    http_headers=None 
    url=/(.*\.(ico$|jpg$|png$|gif$)) 
    script=None 
    upload=None 
    api_endpoint=None 
    expiration=None 
    position=None 
    login=optional 
    mime_type=None
    >
  in "./app.yaml", line 8, column 1

4 个回答

2

我也遇到过同样的问题。教程中的错误确实是下面那两行缺少了空格,所以需要把它改成

handlers:
- url: /(.*\.(ico$|jpg$|png$|gif$))
static_files: phpMyAdmin/\1
upload: phpMyAdmin/(.*\.(ico$|jpg$|png$|gif$))

...

改成

handlers:
- url: /(.*\.(ico$|jpg$|png$|gif$))
  static_files: phpMyAdmin/\1
  upload: phpMyAdmin/(.*\.(ico$|jpg$|png$|gif$))

...

2

试着在每个子项前加一个空格。PHP和Python用的是同样的解析器。在Python中,空格是用来表示代码块的。

application: phpmyadmin2121
version: phpmyadmin
runtime: php
api_version: 1

handlers:
- url: /(.*\.(ico$|jpg$|png$|gif$))
  static_files: phpMyAdmin/\1
  upload: phpMyAdmin/(.*\.(ico$|jpg$|png$|gif$))
  application_readable: true

- url: /(.*\.(htm$|html$|css$|js$))
  static_files: phpMyAdmin/\1
  upload: phpMyAdmin/(.*\.(htm$|html$|css$|js$))
  application_readable: true

- url: /(.*\.(php$))
  script: phpMyAdmin/\1
  secure: always
  login: admin

- url: /(.+)
  script: phpMyAdmin/index.php
  secure: always
  login: admin

- url: /
  script: phpMyAdmin/index.php
  secure: always
  login: admin
14

在我的情况下,这个问题不是因为空格引起的。

我最开始的 app.yaml 文件是:

runtime: nodejs12

handlers:
- url: /.*
  secure: always

... more handlers here ...

这个文件在部署时出现了错误。

Unknown url handler type.
<URLMap 
    secure=always
    ...
    >

根据文档的说明,https://cloud.google.com/appengine/docs/standard/nodejs/config/appref#handlers_element,我在处理程序元素中缺少了 script: auto

为了使用静态处理程序,至少有一个处理程序必须包含这一行 script: auto,或者定义一个入口点元素,才能成功部署。

所以我更新了我的 app.yaml 文件:

runtime: nodejs12

handlers:
- url: /.*
  secure: always
  script: auto

... more handlers here ...

这样就成功部署了。

26

如果有其他人遇到这个问题,我也遇到过同样的情况。你需要为所有子目录添加两个空格。确保这些单词和“url”对齐。

不管用:

- url: /
script: phpMyAdmin/index.php
secure: always
login: admin

不管用:

- url: /
 script: phpMyAdmin/index.php
 secure: always
 login: admin

有效:

- url: /
  script: phpMyAdmin/index.php
  secure: always
  login: admin

另外,把更新应用的命令从这个:

appcfg.py -R -A my_application_id -V phpmyadmin update .

改成这个:

appcfg.py --oauth2 -R -A my_application_id -V phpmyadmin update .

奇怪的是,第一个命令会要求你输入邮箱和密码(我自己的邮箱也不管用)。而使用带有--oauth2选项的第二个命令就能正常工作。

撰写回答