Google App Engine app.yaml PHP 脚本参数
Google App Engine app.yaml PHP scripting parameters
在我的 GAE PHP app.yaml 中,我正在尝试这样做:
application: myapp
version: 1
runtime: php
api_version: 1
threadsafe: yes
handlers:
- url: /sitemap.xml
static_files: sitemap.xml
upload: /sitemap\.xml
- url: /MyOneLink
script: /myDynamicContent.php?myparam=hardcoded_value_1
- url: /MySecondLink
script: /myDynamicContent.php?myparam=hardcoded_value_2
因此可以浏览 http://example.com/MyOneLink 并获得动态结果 php(取决于硬编码的 myparam 值)
问题是浏览时没有显示任何内容。
有什么想法吗?
顺便说一句:你可以弄清楚为什么我还要发布一个 "sitemap.xml":它将用于公开所有 myLinks
谢谢
迭戈
不能在"script:"参数中传递参数。
解决此问题的一种方法是两个有两个 "entry" 脚本,然后包含您的主脚本,如下所示:
<?php
$_GET['myparam'] = 'hardcoded_value_1';
require('main_script.php');
然后您可以在 app.yaml
中引用
这可能是使现有代码正常工作的最快方法(尽管还有更好的方法)。
阅读官方文档https://cloud.google.com/appengine/docs/php/config/mod_rewrite
我这样做了:
<$php
$path = parse_url($_SERVER['PATH_INFO'], PHP_URL_PATH);
if ($path == '/path') {
}
?>
其他答案适用于有限数量的硬编码值(如问题所示)。
但是如果你想使用一个具有无限可能值的真正动态版本,你可能会想到以下(不起作用):
- url: /MyLinks/(.*)/?
script: /myDynamicContent.php?myparam=
以上方法无效。您可以使用简单的 PHP hack.
解决此问题
将 app.yaml
更新为:
- url: /MyLinks/.*
script: /myDynamicContent.php
在 myDynamicContent.php
中,获取 $_SERVER['REQUEST_URI']
的值并解析此字符串以获得 myparam
.
的预期值
更新!更优雅的方法:
<?php
$requestURI = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$requestURI = explode("/", $requestURI);
$myparam = $requestURI[2];
echo $myparam;
?>
Since parse_url
always gets the path info, we can safely depend on hardcoded indices. The array produced by explode
for string /MyLinks/value_1
will contain an empty string at index 0, MyLinks
at 1, value_1
at 2, and so on.
原始笨拙的方法:
<?php
$requestURI = explode("/", $_SERVER["REQUEST_URI"]);
for ($i = 0; $i < count($requestURI); $i++) {
if (strcmp($requestURI[$i], "MyLinks") == 0) {
$myparam = $requestURI[$i + 1];
break;
}
}
echo $myparam;
?>
提示:您可以使用单引号'
代替双引号"
在我的 GAE PHP app.yaml 中,我正在尝试这样做:
application: myapp
version: 1
runtime: php
api_version: 1
threadsafe: yes
handlers:
- url: /sitemap.xml
static_files: sitemap.xml
upload: /sitemap\.xml
- url: /MyOneLink
script: /myDynamicContent.php?myparam=hardcoded_value_1
- url: /MySecondLink
script: /myDynamicContent.php?myparam=hardcoded_value_2
因此可以浏览 http://example.com/MyOneLink 并获得动态结果 php(取决于硬编码的 myparam 值)
问题是浏览时没有显示任何内容。 有什么想法吗?
顺便说一句:你可以弄清楚为什么我还要发布一个 "sitemap.xml":它将用于公开所有 myLinks
谢谢 迭戈
不能在"script:"参数中传递参数。
解决此问题的一种方法是两个有两个 "entry" 脚本,然后包含您的主脚本,如下所示:
<?php
$_GET['myparam'] = 'hardcoded_value_1';
require('main_script.php');
然后您可以在 app.yaml
中引用这可能是使现有代码正常工作的最快方法(尽管还有更好的方法)。
阅读官方文档https://cloud.google.com/appengine/docs/php/config/mod_rewrite 我这样做了:
<$php
$path = parse_url($_SERVER['PATH_INFO'], PHP_URL_PATH);
if ($path == '/path') {
}
?>
其他答案适用于有限数量的硬编码值(如问题所示)。
但是如果你想使用一个具有无限可能值的真正动态版本,你可能会想到以下(不起作用):
- url: /MyLinks/(.*)/?
script: /myDynamicContent.php?myparam=
以上方法无效。您可以使用简单的 PHP hack.
解决此问题将 app.yaml
更新为:
- url: /MyLinks/.*
script: /myDynamicContent.php
在 myDynamicContent.php
中,获取 $_SERVER['REQUEST_URI']
的值并解析此字符串以获得 myparam
.
更新!更优雅的方法:
<?php
$requestURI = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$requestURI = explode("/", $requestURI);
$myparam = $requestURI[2];
echo $myparam;
?>
Since
parse_url
always gets the path info, we can safely depend on hardcoded indices. The array produced byexplode
for string/MyLinks/value_1
will contain an empty string at index 0,MyLinks
at 1,value_1
at 2, and so on.
原始笨拙的方法:
<?php
$requestURI = explode("/", $_SERVER["REQUEST_URI"]);
for ($i = 0; $i < count($requestURI); $i++) {
if (strcmp($requestURI[$i], "MyLinks") == 0) {
$myparam = $requestURI[$i + 1];
break;
}
}
echo $myparam;
?>
提示:您可以使用单引号'
代替双引号"