YouTube 如何使文件夹动态化?例如,您可以访问根目录中的人员频道,例如:
为每个频道创建一个新文件夹显然不是他们的做法,而且他们还具有以下链接:
这是使用 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
.
这将是两个单独的规则。可能有一种方法可以在一条规则中只处理/username
and /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
等等。