使用SO的URL格式为$ _GET

时间:2010-12-15 09:11:42

标签: php url format

StackOverflow具有非常整洁,干净的URL格式。它看起来与目录结构相同,但是这里的每个问题都没有目录!我的问题是:

例如,如何让http://www.site.com/sections/tutorials/tutorial1在地址栏中保持这种状态,但是将其转换为PHP的$_GET请求?

我可以使用.htaccess文件,但我不希望重写URL - 我希望它保持干净和友好。我唯一的选择是使用PHP的字符串拆分函数来获取一些假装的$_GET数据吗?

谢谢,

詹姆斯

5 个答案:

答案 0 :(得分:1)

这样做,使用.htaccess分割网址,网址不会改变,而是指向带有各种$_GET变量的index.php,这可以增加以覆盖更多网址部分。

# turn rewriting on
RewriteEngine on

# get variables in this order, [object], [object,action], [object,action,selection]
RewriteRule ^([^/\.]+)/?$ /index.php?object=$1 [L,NC,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ /index.php?object=$1&action=$2 [L,NC,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /index.php?object=$1&action=$2&selection=$3 [L,NC,QSA]

答案 1 :(得分:0)

PHP Rest框架可以为您完成此操作,因此我建议您使用此question。大多数框架都不会从$_GET加载数据,但会提供类似且同样方便的阅读方式。

答案 2 :(得分:0)

如果您不想使用mod重写,最佳解决方案是使用$_SERVER['REQUEST_URI']变量的正则表达式。

即:

preg_match('|/(.*)/(.*)|', $_SERVER['REQUEST_URI'], $match);
$_GET['param1'] = $match[1];
$_GET['param2'] = $match[2];

如果你想设置一个捕获所有PHP脚本。 IE如果脚本请求不存在则使用默认脚本,使用mod-rewrite将所有内容重定向到一个脚本,即zend框架(以及大多数PHP MVC框架)使用它:

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

我认为这可能有点麻烦。

答案 3 :(得分:0)

它实际上是构建URI的RESTful方式。不仅SO适用于这种模式。我建议不要通过查看this问题来重新发明轮子。

此外,您可以切换到RESTful框架,例如CakePHPCodeIgniter,这些框架默认配置为使用RESTful模式。

答案 4 :(得分:0)

$_GET不包含来自网址的路径组件,只包含最终跟在?之后的参数。你可以用

$parts = explode('/', pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME));
var_dump($parts);

然而,您似乎应该阅读URL重写,例如使用mod_rewrite。 “我不希望重写URL - 我希望它保持干净和友好”......重写发生在服务器上。用户永远不会看到“丑陋”的结果。