Mod重写和重定向目录

时间:2015-01-06 01:25:14

标签: apache .htaccess http

一点解释,然后是2个问题......

基本上我正在构建一个单页应用程序来显示媒体(按标签,按类型等等等)。所有媒体都已上传&由我标记,所以我不是在废弃内容或依赖第三方服务(twitter,facebook,flickr,imgur等...)。我正在使用JS(RequireJS模块......)完成大部分工作,并且正在利用ToroPHP来实现简单,轻量级的工作。 restful API

我的最终目标是:

允许返回的用户键入以下网址: / // ,并始终加载我的根index.php(维护网址)。同时我需要几个可用于api的子目录 获取数据:

  • / assets /(CSS,字体文件,精灵或SVG图标)
  • / components /(对于RequireJS脚本)
  • / api /(这只是一个具有API的ToroPHP实例的子目录)

我相信下面的代码解决了这个问题(我想知道我是否可以很好地解释它在做什么呢?我已经从互联网上的片段拼凑起来了):

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并不是我的专长,但我对学习很有信心。

谢谢!

1 个答案:

答案 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。