Google App Engine "解析./app.yaml时出错:未知的URL处理类型
我正在按照一个教程,在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 个回答
我也遇到过同样的问题。教程中的错误确实是下面那两行缺少了空格,所以需要把它改成
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$))
...
试着在每个子项前加一个空格。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
在我的情况下,这个问题不是因为空格引起的。
我最开始的 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 ...
这样就成功部署了。
如果有其他人遇到这个问题,我也遇到过同样的情况。你需要为所有子目录添加两个空格。确保这些单词和“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选项的第二个命令就能正常工作。