Apache - 动态子文件夹

Apache - 动态子文件夹

YouTube 如何使文件夹动态化?例如,您可以访问根目录中的人员频道,例如:

http://youtube.com/PewDiePie

为每个频道创建一个新文件夹显然不是他们的做法,而且他们还具有以下链接:

http://youtube.com/PewDiePie/about

这是使用 htaccess、Apache 完成的,还是使用 PHP 完成的,我应该在 StackOverflow 上询问?

答案1

这称为 URL 重写。您可以在 Apache 中使用 RewriteEngine 直接在 Apache 的配置中或使用 .htaccess 来执行此操作(实际上没有区别)。您可以在许多其他 Web 服务器上执行此操作(我喜欢 nginx,因为它的性能和易于配置)。

当您重写 URL 时,您将 URL 的动态部分(在您的示例中, / 之后和第二个 / 之前的任何内容都是动态部分之一)分配给一个变量,传递给某种服务器端语言(可以PHP、JSP 都没关系)。然后在服务器端语言中,这是一个常规的 GET 参数,您可以对其进行处理 - 从数据库中读取相关数据,等等。

例如,您重写:

^(.*)/(.*)$ /controller.php?user=$1&page=$2

然后在 PHP 中,代码:

echo $_GET['user'];

将打印:

PewDiePie

答案2

这些并不是系统上真正的物理目录。它们是 URL 名称空间中的动态名称,可映射到物理目录或解释为函数或应用程序的参数,然后对其进行操作。

通常是 URL 重写促进了这种“魔力”。如果您真的很好奇,请看一下 scrapingmagazine 上的这个教程,标题为:URL 重写简介

例子

假设你是维基百科。整个网站主要基于 PHP,所以真实的 URL 是这样的:

http://en.wikipedia.org/w/index.php?title=Barack_obama

但是当您访问该网站时,您可能会看到如下页面:

http://en.wikipedia.org/wiki/Barack_obama

实现这一点的 Apache 配置:

RewriteEngine On
#Look for the word "wiki" followed by a slash, and then the article title
RewriteRule   ^wiki/(.+)$   w/index.php?title=$1   [L]

这需要浏览器正在访问的 URL“http://en.wikipedia.org/wiki/Barack_obama“并将其重写到 Web 服务器 (Apache) 内部,”http://en.wikipedia.org/w/index.php?title=Barack_obama”。

我经常认为这与《星际迷航》中的通用翻译器类似。服务器在输入上获取一组 URL(来自浏览器),并在后端将这些 URL 转换为其他 URL,这些 URL 映射到服务器甚至其他服务器上的实际应用程序和脚本。

答案3

简单地重定向所有没有/,您可以使用简单的 AliasMatch 来实现(来自模组别名):

AliasMatch ^/([^/]+) /path/to/handler.php

然后,您可以查看REQUEST_URI脚本中的环境变量来处理要显示的用户。

然后是一些额外的东西,比如/about处理:

AliasMatch ^/([^/]+)/(about|videos|blah) /path/to/handler.php

或者您可以让它只匹配两个级别(因此/x/y/z不会处理类似的路径),就像我们匹配上面的用户部分一样([^/]+一个或多个不是斜杠的字符):

AliasMatch ^/([^/]+)/([^/]+) /path/to/handler.php

再次使用 来REQUEST_URI确定要显示的内容。

这将“按原样”提供页面 URL(因此浏览器中地址栏上的 URL 保持不变),但内容将由/path/to/handler.php.

这将是两个单独的规则。可能有一种方法可以在一条规则中只处理/usernameand /username/something,但最终很可能会变得非常难以阅读。它们以这种方式完成是为了避免匹配之后的所有内容domain.com

如果您需要将路径更改为脚本的参数,那么您就进入了RewriteRule(从模组重写)。如果您想保留地址栏中的 URL,则必须执行反向代理查询:

 RewriteEngine On
 RewriteRule ^/([^/]+) /path/to/handler.php?user=$1 [LP]
 RewriteRule ^/([^/]+)/(about|videos|blah) /path/to/handler.php?user=$1&args=$2 [LP]

这将节省脚本的处理时间,并且可以从PHP 中REQUEST_URI提取变量。$_GET['user']$GET['args']

同样,AliasMatch第二条规则可能是:

 RewriteRule ^/([^/]+)/([^/]+) /path/to/handler.php?user=$1&args=$2 [LP]

但请注意,您的脚本必须知道如何处理与两个 url 匹配的所有内容。对于以下网址,这可能不是您想要的:

 /errors/404.html
 /about/google.html

等等。

相关内容