3

如何将此.htaccess文件转换为app.yaml文件?

这是.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!.*?public).* index.php [QSA,L]

我需要这样做才能在 Google App Engine 上使用 PHP 运行应用程序。

我之所以问这个问题,是因为谷歌在他们的官方文档中特别推荐了一个代码示例,该示例存储在 Git Hub 中,名为 Dr Edit。Dr Edit 代码示例有一个.htaccess文件,但没有app.yaml文件。而且,在该READ ME文件中,设置应用程序的第一步是创建一个 Google App Engine 应用程序。所以我猜谷歌已经提供了一个代码示例,暗示它将在谷歌应用引擎上运行,但它不会。

据说谷歌正在监控 Stack Overflow 上与 GAE 相关的问题,所以我希望他们能阅读这篇文章。

4

3 回答 3

4

以下是有关如何为 PHP App Engine 应用程序模拟 Apache mod_rewrite $_GET['q'] 路由的信息,以防万一。

于 2014-01-25T04:22:44.537 回答
4

顾名思义.htaccess,它可以控制对目录的访问。.htaccess每次请求都会读取文件。我猜这意味着对域名的每个 HTTP 请求都必须通过该.htaccess文件。所以看起来.htaccess文件就像一个gatekeeper. 从 Wikipedia 看来,该.htaccess文件可用于阻止某些 IP 地址加载网页。

文件的第一行.htaccess是: RewriteEngine On

那行代码:是打开或关闭RewriteEngineApache 的 Apache 指令。Rewriting Engine

所以该.htaccess文件正在查看每个请求,接受请求,然后推出不同的请求。

似乎该app.yaml文件不能直接接受一个 URL 请求,并推出一个不同的请求,但该app.yaml文件可以接受一个 URL 请求,然后运行一个 PHP 脚本,这将改变请求。

因此,在app.yaml文件中,获取 URL 然后重定向到脚本的部分将如下所示:

捕获传入的 URL 请求并导致mod_rewrite.php文件运行。

- url: /Put the incoming URL you want to monitor, catch and redirect here
  script: mod_rewrite.php

使用 app.yaml 重定向 URL 请求

文件的第二行.htaccess是:

RewriteCond %{REQUEST_FILENAME} !-f

这是一个测试,在传入的 URL 请求中寻找匹配项。最后-f是:

-f (是常规文件) 将TestString 视为路径名并测试它是否存在,并且是常规文件。

等一下!前面有一个感叹号。这可能是对逻辑非的测试。那么,如果它不是常规文件呢?

不管什么意思。普通文件和其他所有文件有什么区别?什么是不规则文件?大声笑 idk。无论如何,我猜它正在寻找一个文件。

来自 Apache 文档,这里有一个引用:

服务器变量:这些是 %{ NAME_OF_VARIABLE } 形式的变量,其中 NAME_OF_VARIABLE 可以是从以下列表中获取的字符串:

所以%{REQUEST_FILENAME}第二行的那部分就是 Apache 所说的 a Server-Variable,具体Server-VariableREQUEST_FILENAME.

这是来自 Apache 文档的引用:

REQUEST_FILENAME 与请求匹配的文件或脚本的完整本地文件系统路径,如果在引用 REQUEST_FILENAME 时服务器已经确定了这一点。否则,例如在虚拟主机上下文中使用时,与 REQUEST_URI 的值相同。根据 AcceptPathInfo 的值,服务器可能只使用了 REQUEST_URI 的一些前导组件来将请求映射到文件。

所以我猜该.htaccess文件正在寻找看起来像本地计算机上文件路径的东西?

最后是Rewrite Rule Apache RewriteRule

到底是QSA为了什么?我想它被称为旗帜,并且:

使用 [QSA] 标志会合并查询字符串

QSA 似乎代表Query String Append. 如果传入的 URL 在其末尾有一个查询字符串,您希望如何处理它?

[L] 防止附加任何进一步的重写规则

Appache L 重写标志 Appache 文档 QSA

字符 (^) 称为插入符号。我不知道为什么一开始就使用它。Appache 重写指令的语法是:

RewriteRule pattern target [Flag1,Flag2,Flag3]

所以插入符号是被检测模式的一部分。那个目标简直了index.php。所以看起来如果许多不同的可能请求只是简单地路由回index.php文件,这是应用程序运行的第一件事。

最后的星号可能是任何扩展的通配符。

于 2014-01-25T20:56:15.913 回答
1

我认为您不走运:-( Rewrite 是一个 Apache 模块,但 AppEngine 基于Jetty,因此您必须为此重新设计。您可能可以使用捆绑的 Servlet、过滤器和处理程序之一,但它们都没有是Apache Module mod_rewrite的直接替代品。有些人在 Jetty 之前使用 Apache 作为前端,但这是一种笨拙的方法。抱歉。

于 2014-01-20T14:52:20.283 回答