如何构建app.yaml文件?

时间:2013-07-12 17:29:11

标签: php google-app-engine redirect app.yaml

我正在尝试GAE for php并迷失在app.yaml文件构造中。我可以理解谷歌教程中的部分,该部分显示了如何将所有网址请求指向单个文件

https://developers.google.com/appengine/docs/php/gettingstarted/helloworld

但在我的情况下它没有用。我将发布我已设置的内容,文件结构位于图片中。enter image description here

的app.yaml

application: xxx
version: 1
runtime: php
api_version: 1
threadsafe: true

handlers:
- url: /stylesheets
  static_dir: stylesheets

- url: /images
  static_dir: images

- url: /scripts
  static_dir: scripts

- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: /
  script: main.php
  login: required
  auth_fail_action: redirect

- url: /main
  script: main.php
  login: required
  auth_fail_action: redirect

因此,xxx.appspot.com或xxx.appsport.com/main的目标网页将为main.php。它工作正常。

main.php

<?php
session_start();
date_default_timezone_set('America/Los_Angeles');
require_once 'google/appengine/api/users/UserService.php';

use google\appengine\api\users\User;
use google\appengine\api\users\UserService;

$user = UserService::getCurrentUser();
$name= $user->getNickname();
$name = explode(".",$name);
$name[0]= ucfirst($name[0]);
$name[1]= ucfirst($name[1]);
$name = $name[0]." ".$name[1];
$_SESSION['name']=$name;
$_SESSION['email']= getenv('USER_EMAIL');

header('Location: login.php');

因此它加载启动会话并获取用户名和电子邮件执行一些字符串格式化然后设置为Session变量然后我检查以匹配条件并根据条件重定向到另一个脚本执行更多验证和等等。简单来说,我只是将它重定向到login.php

的login.php

<?php
session_start();
echo $_SESSION['name'];

所以显示的输出值应该是会话变量名称,而是我得到了这个

enter image description here

那我做错了什么?我将使用登录页面从SQL数据库中提取用户数据,并根据该值将用户重定向到不同的页面,这些页面将根据其设置显示不同的表单,表格和报表。

EG。来自login.php

  

如果userA属于Dept1

     

标题('位置:/Dept1/main.php');

     

其他

     

标题('位置:/Deptx/main.php');

所以我希望有很多重定向,每个重定向必须能够继承所设置的会话变量。我能够在普通的PHP服务器上运行时这样做。 GAE版本需要一些重新学习。我想提前感谢任何一个人只是花时间阅读,直到听到。谢谢。

如果有人可以做一个关于如何使用app.yaml的详细教程以及它如何与w3school中的演示示例一起使用,那也不错。

2 个答案:

答案 0 :(得分:9)

你的app.yaml看起来不错;它只是不完整。

你已经为你的main.php脚本定义了“/”和“/ main”映射,并且工作正常。

但是当用户的浏览器请求“/login.php”时,App Engine会在app.yaml中查找并找不到匹配的路由,因此您会收到404错误。

要处理这种特殊情况,您可以使用“url:/login.php”和“script:login.php”进行另一个条目。

然后我会查看你的申请,并确保你没有错过任何其他路线。

您还可能需要在app.yaml中的网址中使用通配符。否则,如果您的应用程序曾将用户发送到“/ main / subpage”之类的URL,则它不会转到main.php处理程序,因为它不匹配app.yaml中的路由。在这种情况下,您可能希望使用“url:/main.*”作为示例。或者你可以在app.yaml的末尾使用一个“/.*”处理程序。

您可以在PHP app.yaml参考页面上了解这些通配符和其他app.yaml选项: https://developers.google.com/appengine/docs/php/config/appconfig

(但是,您不需要为样式表,javascript和图像添加通配符,因为您已经使用了static_dir。)

答案 1 :(得分:2)

这是我的,它可能有所帮助。 Pcode只是我的一个文件夹(不确定你是否需要定义文件夹,但我还是把它留在了那里):

application: theclearview1
version: 10
runtime: php
api_version: 1

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

- url: /css
  static_dir: css

- url: /js
  static_dir: js

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

- url: /Pcode/(.+)
  script: Pcode/\1

- url: /(.+)
  script: \1

- url: /.*
  script: index.php

基本上,我认为以下几行与hostgatorgodaddy等常规php主机类似:

handlers:
- url: /(.*\.(htm$|html$|css$|js$))
  static_files: \1

  upload: (.*\.(htm$|html$|css$|js$))
  application_readable: true

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

  upload: (.*\.(ico$|jpg$|png$|gif$))
  application_readable: true

- url: /(.+)
  script: \1

- url: /.*
  script: index.php