一点解释,然后是2个问题......
基本上我正在构建一个单页应用程序来显示媒体(按标签,按类型等等等)。所有媒体都已上传&由我标记,所以我不是在废弃内容或依赖第三方服务(twitter,facebook,flickr,imgur等...)。我正在使用JS(RequireJS模块......)完成大部分工作,并且正在利用ToroPHP来实现简单,轻量级的工作。 restful API
我的最终目标是:
允许返回的用户键入以下网址: / 或 // ,并始终加载我的根index.php(维护网址)。同时我需要几个可用于api的子目录 获取数据:
我相信下面的代码解决了这个问题(我想知道我是否可以很好地解释它在做什么呢?我已经从互联网上的片段拼凑起来了):
RewriteEngine on
RewriteRule ^/?assets/.+$ - [L]
RewriteRule ^/?components/.+$ - [L]
RewriteRule ^/?api/.+$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php [L]
此外,我希望你能帮助我找到一种方法,只允许我的应用程序" (也就是说,内部调用(是否存在Apache上的服务器用户?)由RequireJS模块发起到API)以访问/ assets /& / components /& / api / so如果用户键入/ api / test?subject = 123,它们将被路由到不是index.php的页面,但也不是实际的API。我希望这对于/ components /& / assets /。
*摘要问题:
1)。帮助解释上面的代码片段。
2)。我可以允许我的服务器访问/ assets /& amp; / components /& / api /但不允许用户输入?
显然,Apache并不是我的专长,但我对学习很有信心。
谢谢!
答案 0 :(得分:1)
帮助解释上面的代码段。
RewriteEngine on
打开重写引擎,除非打开重写引擎,否则任何规则都不会执行任何操作
RewriteRule ^/?assets/.+$ - [L]
RewriteRule ^/?components/.+$ - [L]
RewriteRule ^/?api/.+$ - [L]
这些规则称为“传递”规则。 -
目标表示“不执行任何操作”,L
标志将停止对当前传递的重写。这些基本上只是意味着:如果URI以/assets/
开头,则不执行任何操作并停止重写。如果URI以/components/
开头,则不执行任何操作并停止重写。如果URI以/api/
开头,则不执行任何操作并停止重写。
下一条规则有一些与之相关的条件。除非符合所有条件,否则不会应用该规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
检查请求的URI是否映射到现有文件或目录,!-f
表示请求不是针对文件,!-d
表示请求不是目录。< / p>
RewriteCond $1 !^(index\.php)
检查请求是否不以/index.php
开头。
最后,如果满足所有3个条件,那么:
RewriteRule ^(.*)$ /index.php [L]
重写/index.php
的请求,并停止重写。
我可以允许我的服务器访问/ assets /& amp; / components /&amp; / api /但不允许用户输入?
没有。如果有人访问您的页面并且您的页面链接到其中一个目录中的内容,则浏览器会加载它,就像有人将其键入URL地址栏一样。唯一的区别是(有时)浏览器将包含一个“Referer”标头请求,让服务器知道哪个页面告诉浏览器加载文件。它并不总是被所有浏览器使用,并且很容易被伪造。因此,检查引用者并不能保证人们仍然无法直接加载您的文件。
为了检查引用者,请在RewriteEngine On
行下方添加:
RewriteCond %{HTTP_REFERER} !^https?://example.com/
RewriteRule ^(assets|components|api)/ - [L,F]
这实际上是检查引用者的条件,如果不以“http://example.com”或“https://example.com”开头,则假设“example.com” “是您的网站,然后规则会检查请求是以/assets/
,/components/
还是/api/
开头,并在不更改任何内容的情况下传递,F
标记除外导致服务器返回403 Forbidden。