.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为啥?
Posted
技术标签:
【中文标题】.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为啥?【英文标题】:What does the RewriteRule in .htaccess convert to in an app.yaml file?.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为什么? 【发布时间】:2014-02-09 03:46:29 【问题描述】:如何将此.htaccess
文件转换为app.yaml
文件?
这是.htaccess
文件:
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(?!.*?public).* index.php [QSA,L]
我需要这样做才能在 Google App Engine 上使用 PHP 运行应用程序。
我之所以问这个问题,是因为 Google 在其官方文档中特别推荐了一个代码示例,该示例存储在 Git Hub 中,名为 Dr Edit。 Dr Edit 代码示例有一个.htaccess
文件,但没有app.yaml
文件。而且,在 READ ME
文件中,设置应用程序的第一步是创建一个 Google App Engine 应用程序。所以我猜 Google 提供了一个代码示例,暗示它可以在 Google App Engine 上运行,但它不会。
据说谷歌正在监视 Stack Overflow 上与 GAE 相关的问题,所以我希望他们能阅读这篇文章。
【问题讨论】:
【参考方案1】:以下是有关如何为 PHP App Engine 应用程序simulate Apache mod_rewrite $_GET['q'] routing 的信息,以防万一。
【讨论】:
【参考方案2】:正如名称.htaccess
所暗示的那样,它可以控制对目录的访问。每次请求都会读取.htaccess
文件。我猜这意味着对域名的每个 HTTP 请求都必须通过 .htaccess
文件。所以看起来.htaccess
文件就像gatekeeper
。从 Wikipedia 看来,.htaccess
文件似乎可用于阻止某些 IP 地址加载网页。
.htaccess
文件的第一行是:RewriteEngine On
那行代码:RewriteEngine
是一个 Apache 指令,它可以打开或关闭 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
Redirect URL requests with app.yaml
.htaccess
文件的第二行是:
RewriteCond %REQUEST_FILENAME !-f
这是一个测试,在传入的 URL 请求中寻找匹配项。末尾的-f
用于:
-f (是普通文件) 把TestString当作一个路径名并测试它是否存在,并且是一个普通文件。
哦,等等!前面有一个感叹号。这可能是对逻辑非的测试。那么,如果它不是常规文件呢?
不管那是什么意思。普通文件和其他所有文件有什么区别?什么是不规则文件?大声笑 idk。不管怎样,我猜它正在寻找一个文件。
来自 Apache 文档,这里有一段引述:
服务器变量:这些是 % NAME_OF_VARIABLE 形式的变量 其中 NAME_OF_VARIABLE 可以是取自以下字符串的字符串 列表:
所以第二行的%REQUEST_FILENAME
部分就是Apache 所说的Server-Variable
,而具体的Server-Variable
是REQUEST_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 rewrite flag Appache Documentation QSA
字符 (^) 称为插入符号。我不知道为什么一开始就使用它。 Appache 重写指令的语法是:
RewriteRule pattern target [Flag1,Flag2,Flag3]
所以插入符号是被检测模式的一部分。该目标只是index.php
。所以看起来如果许多不同的可能请求只是简单地路由回index.php
文件,这是应用程序运行的第一件事。
末尾的星号可能是任何扩展的通配符。
【讨论】:
这个答案有帮助吗?我认为 .htaccess 只是一个数据文件,所以它不能做任何事情,而 Apache Web 服务器(执行 .htaccess 中指定的事情)并没有在 AppEngine 上运行。 Web 服务器 Apache 是否真正运行您的 PHP 应用程序? PHP Runtime Environment 中仅有的两次提到 Apache 并不能证实确实如此。前面提到的PHP mod_rewrite simulator 不使用.htaccess。出于好奇,您是如何解决问题的? 我放弃了尝试运行Dr Edit
示例。我仍在使用 GAE,并且我确实坚持使用 PHP,但就这个特定问题而言,这只是另一条无路可走的死胡同,我猜是一场我无法赢得的战斗。愚蠢到无法解决问题的好处是,它迫使我找到一种更简单、更简单的方法来解决问题。大声笑
:-) 我还发现尝试解决问题是一种很好的学习方式,即使最初的问题没有得到解决。有人称它为Yak Shaving 为例。【参考方案3】:
我认为您不走运 :-( Rewrite 是一个 Apache 模块,但 AppEngine 基于 Jetty,因此您必须为此重新设计。您可能可以使用 Bundled Servlets, Filters, and Handlers 之一,但没有一个它们是Apache Module mod_rewrite 的直接替代品。有些人在Jetty 之前使用Apache 作为前端,但这是一种笨拙的方法。抱歉。
【讨论】:
好像有办法重定向网址。 这是一个很棒的 PHP 解决方法。我希望它对你有用。以上是关于.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为啥?的主要内容,如果未能解决你的问题,请参考以下文章
我的 .htaccess 中的 RewriteRule 命令不起作用
htaccess 中的 Apache RewriteRule - 路由已损坏
htaccess 中的 RewriteRule 失败,但它可能是我的主机