将动态URL转换为url等目录

时间:2011-05-29 19:43:50

标签: php apache mod-rewrite

中。我已经找到了大量有关转换特定网址字符串的资源(domain.com/?hello=world到domain.com/hello/world),但我正在寻找的是一种动态转换我传递给目录结构的任何网址的方法或者我应该说,如果你去domain.com/hello/world然后它会自动传递到我的php脚本:domain.com/?hello / world。我需要它是完全动态的,以便我发送的任何内容都将被转换。

domain.com/login/register被我的php脚本视为domain.com/?login=register domain.com/login = domain.com/?login= domain.com/hello/world = domain.com/?hello=world domain.com/pages/about = domain.com/?pages=about domain.com/about = domain.com/?about

更重要的是,我需要能够做到这一点..

域名网站/登录/确认 domain.com/posts/categories/general = domain.com/?posts=categories&general

基本上每个奇数目录都是get Key,每个even都是一个值(如果有的话)。这需要持续一段时间,而不仅限于2或3个键/值字符串。

编辑:这是我最初想出的(见下面的最终解决方案)。

的.htaccess

RewriteEngine On
RewriteBase /

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

的index.php

$ReqURI = array_filter(explode('/',$_SERVER['REQUEST_URI']));

这是最终的解决方案,这要归功于一些线程和一些调整。

的.htaccess

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

的index.php

if(preg_match_all('([^/]+)', $_SERVER['REQUEST_URI'], $matches)){
    $val = array();
    $key = array();
    foreach ($matches[0] as $i => $req){
        if($i % 2){
            $val[] = $req;
        }else{
            $key[] = $req;
        }
    }
    if(count($val) < count($key)){
    $val[] = '';
    }
    $params = array_combine($key,$val);
    print_r($params);
}

3 个答案:

答案 0 :(得分:5)

使用上面的Nev Stokes PHP代码并尝试像这样创建.htaccess文件,这样它就不会破坏其他(静态)资源:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR] # 1. is this a request to static file ?
RewriteCond %{REQUEST_FILENAME} -l [OR] # 2. if not, is it a request to a symlink ?
RewriteCond %{REQUEST_FILENAME} -d      # 3. if not, is it a request to a directory ?
RewriteRule ^.*$ - [NC,L]               # 4. if true ( any of those three above ), serve the request normally and STOP ( because of L  `last` flag ).
RewriteRule ^.*$ index.php [NC,L]       # 5. if neither 1,2,3 are true, redirect to index.php

答案 1 :(得分:2)

如果您想重写所有内容,那么这非常简单。

在.htaccess文件中:

RewriteEngine on
RewriteRule .* serve.php

在serve.php中,此代码将根据您的要求从URL创建一个带有键/值的数组:

if (preg_match_all('#([^/]+)(?:/([^/]+))?#', trim($_SERVER['REQUEST_URI'], '/'), $matches)) {
    $params = array_combine($matches[1], $matches[2]);
    var_dump($params);
}

答案 2 :(得分:1)

这是编写动态网址的非常好的教程。你的特定问题就在那里发布了。

.htaccess tricks and tips