<p>不幸的是,没有什么好办法。功能请求在这里:<a href="https://code.google.com/p/googleappengine/issues/detail?id=8380&q=type%3DFeature%20error%20404&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log" rel="nofollow">https://code.google.com/p/googleappengine/issues/detail?id=8380&q=type%3DFeature%20error%20404&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log</a></p>
<p>由于文件不在<code>static_dir</code>中,因此无法为404配置自定义处理程序或静态错误页。如果URL与子路径下的任何内容匹配,则<code>static_files</code>也是如此,这相当于<code>static_dir</code>:</p>
<pre><code>handlers:
- url: /files/(.*)
static_files: files/\1
upload: files/.*
</code></pre>
<p>URL路径与特殊静态处理程序的URL模式相匹配。然后请求的静态处理程序意识到不存在该文件。控件不会返回到路由逻辑,也没有机会自定义静态处理程序的响应。静态处理程序只返回泛型404。在</p>
<p>如果<code>static_files</code>的URL模式与现有的文件名完全匹配,那么不匹配的URL路径将落入后续处理程序中,可能包括底部的一个catch all。但这实际上是在配置文件中单独列出所有静态文件:</p>
^{pr2}$
<p>同样不幸的是,<code>error_handlers:</code>也没有帮助,因为它还不支持自定义404。值得注意的是,如果<code>handlers:</code>与URL不匹配,则App Engine返回的404也是通用的,也无法自定义。在</p>
<p>完全满足这一要求而不在处理程序的URL模式中列出静态文件名的唯一方法是不使用静态文件,而是使用应用程序处理程序从应用程序文件中提供静态数据(如果找不到,则提供自定义404消息)。在</p>
<pre><code>handlers:
- url: .*
script: filehandler.app
</code></pre>