我正在用一些轻巧的PHP代码为我的朋友开发一个静态网站。每个页面的网址上都有一个.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
答案 0 :(得分:1)
如果您确定所有静态文件都已在app.yaml
中处理,并且根(/
)已处理,则意味着剩下的所有内容都将写入脚本。因此,您的最终处理程序可能是:
- 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
,需要一个有效URL列表(就像在.htaccess中一样)。您可以使用app.yaml
中的正则表达式来做到这一点。然后,要处理404
,需要完成一个处理程序:
- url: /(home|about|contact|page1|page99|etc)$ ## the pipe (|) means "or"
script: \1.php
- url: /.*
script: 404.php
然后,您编写一个简单的404.php脚本页面以显示正确的消息并传递404
http响应。