0

我有一个 index.php 文件,我想根据 url 结构提供不同的内容。

例如。如果 url 是 mysite.com/index.php/folder1 我运行某个查询并显示结果,如果 url 是 mysite.com/index.php/folder2,则运行不同的查询。

该解决方案还必须适用于 mysite.com/folder1 等(即省略 index.php)。

如果可以将相同的方法扩展到 mysite/com/folder1/category1 等,那将是理想的。注意,这里不需要 GET 变量。

4

3 回答 3

2

您需要的是一个路由组件,它将 url 链接到代码中的类/函数。该组件根据您的要求执行某些类/功能。 在这个问题中,讨论了不同的策略,尽管缺少一些有趣的现有框架:

您可以使用其中任何一个来完成我之前提到的操作。例如,使用 Symfony 路由组件,您可以将您的路由(潜在的 url)放在一个配置文件中,例如:

# routes.yml
route1:
    path:     /foo
    defaults: { _controller: 'MyController::fooAction' }

route2:
    path:     /foo/bar
    defaults: { _controller: 'MyController::foobarAction' }

因此,当请求的 uri 与“/foo”匹配时,MyController类中的fooAction方法将被执行。如果您不确定如何在现有代码库中实现这一点,我强烈建议您阅读Fabien Potencier 撰写的关于如何在代码中使用不同 Symfony 组件的系列文章。有一个关于路由部分的特定帖子。

至于需要从你的url中删除“index.php/”,你需要重写它。如果您使用的是 Apache,则需要在虚拟主机配置文件中添加重写规则,或者只需在文档根目录中创建一个 .htaccess 文件。StackOverflow 中有数百个关于这个的问题(比如这个),官方文档页面中有大量文档。

于 2013-03-26T10:43:42.067 回答
0

在您的 .htaccess 文件中添加以下 RewriteRule 并将 .htaccess 文件放入您的 webroot

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

如果系统上不存在文件/目录,上述规则会将所有请求重定向到 index.php。

例如,如果没有上述规则,如果http://example.com/test返回 404 错误,那么使用上述重定向规则,这将解析为 index.php。现在,在 index.php 中,您可以解析 URL 并根据您的要求进行处理。

于 2013-03-26T10:47:30.683 回答
0

最好的方法可能是在浏览器中分配变量。例如

index.php?folder=1      AND index.php?folder=2

然后在 php 中使用:

$folder = $GET_['folder']
if($folder == 1)
{
    //show site 1
}
else if ($folder == 2)
{
    //show site 2
}
else
{
    //error code
}

还有其他方法,包括 .htaccess 但对于不想参与其中的人,我发现这是最好的方法

于 2013-03-26T10:45:33.913 回答