我正在为我的朋友开发一个静态网站,其中包含一些简单的PHP代码。每个页面上的URL都有一个.php,例如xxxxx.com/service.php。我做了一些研究,发现调整app.yaml
并不是一种优雅的方法,因为它不会优雅地处理错误404。在我看来,我可以创建一个特殊的PHP文件,接收来自app.yaml
的.php请求,并处理每个请求,如.htaccess
。由于我缺乏PHP知识,我无法在文件中生成代码。请赐教我这个过程。
下面是我的app.yaml
runtime: php55
api_version: 1
instance_class: F1
automatic_scaling:
max_idle_instances: 1
min_pending_latency: 30ms
max_instances: 1
handlers:
- url: /css
static_dir: css
secure: always
- url: /js
static_dir: js
secure: always
- url: /images
static_dir: images
secure: always
- url: /fonts
static_dir: fonts
secure: always
- url: /sitemap\.xml
static_files: sitemap.xml
upload: sitemap.xml
secure: always
- url: /
script: index.php
secure: always
- url: /(.+\.php)$
script: \1
secure: always
- url: /.*
script: 404.php
secure: always
如果您确定所有静态文件都已在app.yaml
中处理,并且处理了root(/
),则意味着剩下的任何内容都将转到脚本中。所以,你的最终处理程序可能是:
- url: /(.+)
script: \1.php
我会离开的
- url: /(.+\.php)$
script: \1
它上面的处理程序,作为倒数第二个处理程序,所以一个人可以去/about
或/about.php
,它将处理两者。
- url: /(.+)\.php$
script: \1.php
也许重定向.php
版本美化,所以用户随着时间的推移适应,而不是获得404
:
- url: /(.+)\.php$
script: redirect.php
redirect.php:
<?php
require_once __DIR__ . '/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/{scriptName}.php', function($scriptName) {
header('Location: https://www.example.com/NewAbout/{$scriptName}');
exit();
})
?>
更新:要处理404
s,您需要一个有效URL列表(就像在.htaccess中一样)。您可以在app.yaml
中使用正则表达式执行此操作。然后,为了处理404
s,你完成了一个catchall处理程序:
- url: /(home|about|contact|page1|page99|etc)$ ## the pipe (|) means "or"
script: \1.php
- url: /.*
script: 404.php
然后你编写一个简单的404.php脚本页面来显示正确的消息并发送一个404
http响应。