如何根据url结构在PHP中执行不同的操作

时间:2013-03-26 10:32:31

标签: php

我有一个index.php文件,我希望根据网址结构提供不同的内容。

例如。如果网址是mysite.com/index.php/folder1,我会运行某个查询并显示结果,如果网址是mysite.com/index.php/folder2,请运行其他查询。

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

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

3 个答案:

答案 0 :(得分:2)

你需要的是一个路由组件,它将url链接到代码中的类/函数。该组件根据您的请求执行某些类/功能。 In this question,讨论了不同的策略,尽管有一些已经存在的框架缺失有趣:

你可以使用其中任何一个完全按我前面提到的那样做。例如,使用Symfony Routing Component,您可以在配置文件中包含您的路由(潜在URL),如:

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

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

因此,当请求的uri与“/ foo”匹配时,将执行 MyController 类中的方法 fooAction 。 如果您不确定如何在现有代码库中实现此功能,我强烈建议您阅读由Fabien Potencier撰写的a series of posts about how to use different Symfony components in your code。关于路由部分有a specific post

至于需要从您的网址中删除“index.php /”,您需要重写它。如果您使用的是Apache,则需要在虚拟主机配置文件中添加重写规则,或者只在文档根目录中创建.htaccess文件。 StackOverflow中有数百个问题(如this one),以及official documentation page中的大量文档。

答案 1 :(得分:0)

最好的方法可能是在浏览器中分配变量。 e.g。

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但是对于那些不想进入的人,我发现这是最好的方式

答案 2 :(得分: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并根据您的要求进行处理。