Mod 重写和重定向目录
Mod Rewrite and Redirecting directories
一点解释,然后是 2 个问题....
本质上,我正在构建一个单页应用程序来显示媒体(按标签、按类型等)。所有的媒体都是由我上传和标记的,所以我不是为了内容而抓取或依赖第三方服务(twitter、facebook、flickr、imgur 等)。我正在使用 JS(RequireJS 模块...)完成大部分工作,并利用 ToroPHP 实现简单、轻量级和 restful API
我的最终目标是:
允许返回的用户输入如下 URL:/ 或 //,并始终加载我的根 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 !^(index\.php)
RewriteRule ^(.*)$ /index.php [L]
此外,我希望你能帮我想出一种方法,只允许我的 "app"(即内部调用(apache 上有服务器用户吗?)由 RequireJS 模块发起到 API) 访问 /assets/ & /components/ & /api/ 所以如果用户输入 /api/test?subject=123 他们被路由到一个页面不是index.php,但也不是实际的 API。我希望 /components/ & /assets/ 也一样。
*总结题:
1).帮忙解释一下上面的代码片段。
2).我可以允许我的服务器访问 /assets/ & /components/ & /api/ 但不允许用户输入它们吗?
Apache显然不是我的专长,但我对学习还是很有信心的。
谢谢!
Help explain the code snippet above.
RewriteEngine on
打开重写引擎,none 的规则将执行任何操作,除非打开重写引擎
RewriteRule ^/?assets/.+$ - [L]
RewriteRule ^/?components/.+$ - [L]
RewriteRule ^/?api/.+$ - [L]
这些规则称为 "pass-through" 规则。 -
目标表示 "do nothing" 并且 L
标志停止当前通道的重写。这些本质上只是意味着:如果 URI 以 /assets/
开头,什么都不做并停止重写。如果 URI 以 /components/
开头,什么都不做并停止重写。如果 URI 以 /api/
开头,则什么都不做并停止重写。
下一条规则有几个与之关联的条件。除非满足 所有 条件,否则不会应用该规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
这些检查请求的 URI 是否映射到现有文件或目录,!-f
表示请求不是文件,!-d
表示请求不是目录.
RewriteCond !^(index\.php)
这会检查请求是否不以 /index.php
开头。
最后,如果三个条件都满足,那么:
RewriteRule ^(.*)$ /index.php [L]
将任何请求重写到 /index.php
,并停止重写。
Can I allow my server access to /assets/ & /components/ & /api/ but not allow a user to type into them?
没有。如果有人访问您的页面并且您的页面链接到这些目录之一中的某些内容,浏览器会加载它,就像有人将它键入 URL 地址栏一样。唯一的区别是(有时)浏览器会包含一个 "Referer" header 请求,让服务器知道哪个页面告诉浏览器加载文件。它并不总是会被所有浏览器使用,而且很容易被伪造。所以检查 referer 并不能保证人们仍然不能直接加载你的文件。
为了检查引荐来源网址,请在 RewriteEngine On
行下方添加:
RewriteCond %{HTTP_REFERER} !^https?://example.com/
RewriteRule ^(assets|components|api)/ - [L,F]
这本质上是一个检查referer的条件,如果不以“http://example.com" or "https://example.com”开头,假设"example.com"是你的站点,则规则检查请求是否以 /assets/
、/components/
或 /api/
开头,并在不更改任何内容的情况下通过它,除了 F
标志会导致服务器到 return 403 禁止。
一点解释,然后是 2 个问题....
本质上,我正在构建一个单页应用程序来显示媒体(按标签、按类型等)。所有的媒体都是由我上传和标记的,所以我不是为了内容而抓取或依赖第三方服务(twitter、facebook、flickr、imgur 等)。我正在使用 JS(RequireJS 模块...)完成大部分工作,并利用 ToroPHP 实现简单、轻量级和 restful API
我的最终目标是:
允许返回的用户输入如下 URL:/ 或 //,并始终加载我的根 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 !^(index\.php)
RewriteRule ^(.*)$ /index.php [L]
此外,我希望你能帮我想出一种方法,只允许我的 "app"(即内部调用(apache 上有服务器用户吗?)由 RequireJS 模块发起到 API) 访问 /assets/ & /components/ & /api/ 所以如果用户输入 /api/test?subject=123 他们被路由到一个页面不是index.php,但也不是实际的 API。我希望 /components/ & /assets/ 也一样。
*总结题:
1).帮忙解释一下上面的代码片段。
2).我可以允许我的服务器访问 /assets/ & /components/ & /api/ 但不允许用户输入它们吗?
Apache显然不是我的专长,但我对学习还是很有信心的。
谢谢!
Help explain the code snippet above.
RewriteEngine on
打开重写引擎,none 的规则将执行任何操作,除非打开重写引擎
RewriteRule ^/?assets/.+$ - [L]
RewriteRule ^/?components/.+$ - [L]
RewriteRule ^/?api/.+$ - [L]
这些规则称为 "pass-through" 规则。 -
目标表示 "do nothing" 并且 L
标志停止当前通道的重写。这些本质上只是意味着:如果 URI 以 /assets/
开头,什么都不做并停止重写。如果 URI 以 /components/
开头,什么都不做并停止重写。如果 URI 以 /api/
开头,则什么都不做并停止重写。
下一条规则有几个与之关联的条件。除非满足 所有 条件,否则不会应用该规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
这些检查请求的 URI 是否映射到现有文件或目录,!-f
表示请求不是文件,!-d
表示请求不是目录.
RewriteCond !^(index\.php)
这会检查请求是否不以 /index.php
开头。
最后,如果三个条件都满足,那么:
RewriteRule ^(.*)$ /index.php [L]
将任何请求重写到 /index.php
,并停止重写。
Can I allow my server access to /assets/ & /components/ & /api/ but not allow a user to type into them?
没有。如果有人访问您的页面并且您的页面链接到这些目录之一中的某些内容,浏览器会加载它,就像有人将它键入 URL 地址栏一样。唯一的区别是(有时)浏览器会包含一个 "Referer" header 请求,让服务器知道哪个页面告诉浏览器加载文件。它并不总是会被所有浏览器使用,而且很容易被伪造。所以检查 referer 并不能保证人们仍然不能直接加载你的文件。
为了检查引荐来源网址,请在 RewriteEngine On
行下方添加:
RewriteCond %{HTTP_REFERER} !^https?://example.com/
RewriteRule ^(assets|components|api)/ - [L,F]
这本质上是一个检查referer的条件,如果不以“http://example.com" or "https://example.com”开头,假设"example.com"是你的站点,则规则检查请求是否以 /assets/
、/components/
或 /api/
开头,并在不更改任何内容的情况下通过它,除了 F
标志会导致服务器到 return 403 禁止。