我正在上一门在线课程,其中讲师实施了一些Apache重写规则-这是我以前从未遇到过的,而讲师未能详细解释。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
我知道那里有重写URL的规则,使得public/
似乎不是其中的一部分。但是,我需要更详细的解释。
我的问题本质上是:有人可以解释这些重写规则如何将类似application/public/index
的内容变成application/index
吗?
答案 0 :(得分:0)
首先:
这是一个骇客行为,目的是能够在廉价或糟糕的托管提供程序中使用现代框架或应用程序,该提供程序不允许在公共目录树之外包含文件。它通常需要补充一些其他设置,以防止下载私人内容。
Apache Web服务器具有comprehensive documentation,其中解释了所有指令。由于某些原因,许多开发人员都不愿意查看此文档。
现在,从上到下:
<IfModule> mod_rewrite.c> 仅当服务器安装并启用了URL重写模块(mod_rewrite)时,才会执行包装在内部的配置。当模块不可用时,它可以防止站点崩溃(当然,如果站点确实需要该模块,则仅意味着它将以某种其他方式失败)。
RewriteEngine启用启用该模块提供的URL重写功能(具有可用的模块并不意味着它已打开)。
RewriteRule是这一切的核心:
RewriteRule Pattern Substitution [flags]
当当前URL遵循给定的模式时,它将使用 Substitution 进行转换。
标记last|L
表示立即停止重写过程,并且不再应用任何规则。然后,重新开始使用新的URL,直到没有更多适用的规则。
(.*)
是一个正则表达式,表示“匹配出现零次或多次的任何字符并将其存储为” group 1”。$1
中的public/$1
意味着“插入group 1这里”。
因此,简而言之,它隐藏了对http://example.com/foo.jpg
的“公开”目录si请求,该请求通常会映射到/var/www/htdocs/foo.jpg
,而映射到/var/www/htdocs/public/foo.jpg
。