我在 App Engine 中有一个使用默认 app.yaml 文件的静态站点。主 url 处理程序如下所示:
- url: /(.*)
static_files: www/\1
upload: www/(.*)
我想直接提出表格的所有请求:
http://mysite/somedirectory
和 http://mysite/somedirectory/
到
http://mysite/somedirectory/index.html
有什么好的方法吗?
对于
http://mysite/somedirectory/
url 模式,你可以有一个像这样的处理程序:
- url: /(.*)/$
static_files: www/\1/index.html
upload: www/.*/index.html
当然,这个处理程序必须插入到您已有的 catch-all 处理程序之前。
但是对于
http://mysite/somedirectory
url 模式,事情很棘手,因为您无法判断 somedirectory
是否代表文件并且应该按原样提供服务还是目录,在这种情况下,应该提供相应的 index.html
。
除非您遵循可用于区分文件和目录的严格规则。例如,如果您知道 all 文件的名称中包含
.
以及其后的文件扩展名,并且 all 目录的名称中没有 .
,那么您可以使用一对如下处理程序:
# a "." in name means a file, serve as-is:
- url: /(.*\/[^\/]*\.[^\/]*)$
static_files: www/\1
upload: www/.*
# no "." in name means a directory, serve corresponding index.html:
- url: /((.*))$
static_files: www/\1/index.html
upload: www/.*/index.html
由于这对本身成为一个包罗万象的过滤器,因此它应该放在最后(您可能拥有的所有其他处理程序都应该放在它之前),替换您拥有的包罗万象的处理程序。
丹的回答让我走上了正轨。它适用于除根目录之外的所有内容。不过,我犯了一个错误,破坏了我原来的版本。这是一个可行的解决方案:
runtime: python39
handlers:
# Special case for the site root directory
- url: /$
static_files: www/index.html
upload: www/index.html
# Ending in a slash means a directory, serve corresponding index.html:
- url: /(.*)/$
static_files: www/\1/index.html
upload: www/.*/index.html
# Containing a "." means a file, serve as-is:
- url: /(.*\..*)
static_files: www/\1
upload: www/.*
# Did not match above, so must be a directory, serve corresponding index.html:
- url: /(.*)
static_files: www/\1/index.html
upload: www/.*/index.html
查看正在运行的网站