преобразование динамических URL-адресов в каталог, как URL - PullRequest
2 голосов
/ 29 мая 2011

Из. Я нашел много ресурсов по преобразованию определенных строк URL (domain.com/?hello=world в domain.com/hello/world), но мне нужен способ динамического преобразования ЛЮБОГО URL, который я передаю в структуру каталога или я должен сказать, что если вы перейдете на 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 / логин / регистрация / подтверждение / 6473440367233483730126345 = domain.com/?login=register&confirm=6473440367233483730126345 domain.com/posts/categories/general = domain.com/?posts=categories&general

в основном каждый нечетный каталог является ключом get, а каждый четный является значением (если оно есть). Это должно продолжаться столько времени, сколько необходимо, и не должно ограничиваться только 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 ]

5 голосов
/ 30 мая 2011

Используйте PHP-код Nev Stokes, указанный выше, и попытайтесь создать файл .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
2 голосов
/ 30 мая 2011

Если вы хотите переписать все, тогда это действительно довольно просто.

В вашем файле .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);
}
1 голос
/ 29 мая 2011

Это очень хороший учебник для написания динамических URL. и ваша конкретная проблема опубликована там.

.htaccess хитрости и советы

...