mod rewrite ve sorgu dizeleri

4 Cevap php

Ben bu gibi benim URL sahip bazı sorgu dizeleri yeniden çalışıyorum:

foo.com/index.php?page=admin&view=news&action=edit&id=3

karşı

foo.com/admin/news/edit/3

Ama onu bilemiyorum ...

Ben her zaman tabii, benim URL'ler bu 4 parametreleri (sayfa, görünüm, aksiyon, id) yok çünkü ben sadece, örneğin 'sayfa' parametreleri varsa o da çalışıyor olmalıdır.

herhangi bir öneriniz?

4 Cevap

Kolay yolu PHP kodu ayrıştırma en yapmaktır.

Gibi rewriterules kullanın

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

Ve sonra PHP ($_SERVER['REQUEST_URI']) isteği uri erişebilir ve istediğiniz gibi pek çok yerinde ayrıştırmak.

Ben parametrelerin bir diziye kullanmak istediğiniz url'lerin tür ayrıştırmak için bu kodu yazdım. Bu, her sayfada tamamen farklı şekillerde parametreleri kullanabilirsiniz, yani esnek. Sen o önerdi Joel L gibi bir isteği işleyicisi kullanmak gerekecektir.

Old-school $ _GET sorgu dizeleri ihtimale anlaşılması için de izin verir, ve aynı zamanda kontrol komut dosyası yolu ziyade tüm url ile birlikte, size beklediğiniz gibi davranmaya $ _SERVER ['PHP_SELF'] yazar Tüm parametreler.

Ben hızlı bir şekilde tek başına işlevi olarak kullanılmak için düzenlenmiş, bu yüzden yazım hataları dikkat. Ayrıca, bu kod geliştirmek için herhangi bir öneri bekliyoruz.

<?php 
function parseRequestUrl($http_server = 'http://example.com'){

    $request = $_SERVER['REQUEST_URI'];
    $request = explode('?', $request);
    if (isset($request[1])){
        $get_data = $request[1];
        parse_str($get_data, $_GET);
    }
    $request = $request[0];

    $url_data = array_values(array_filter(explode('/', $request)));
    $url_level = substr_count($http_server, '/', 8);
    foreach($url_data as $key => $val){
        if($key>$url_level){
            $parameter[] = $val;
        } else if ($key==$url_level){ // controller is also stored at $this->parameter[0]
            $parameter[] = $controller = $val;
        }
    }

    if(!isset($controller) || !$controller){
        $parameter[0] = $controller = 'index';
    }
    $_SERVER['PHP_SELF'] = $http_server.'/'.$controller;

    return $parameter;
}
  ?>

$ Http_server için sitenizin etki alanı kullanın.

So if you use this on the request of: http://site.com/news/category/arts/page/5

Aşağıdaki değişken geri alırsınız:


$parameter[0] => 'news'
$parameter[1] => 'category'
$parameter[2] => 'arts'
$parameter[3] => 'page'
$parameter[4] => '5'

.: Senin htaccess dosyasında bu iki satır koymak

RewriteRule ^/([^/]+)$ index.php?page=$1 [L]
RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ index.php?page=$1&view=$2&action=$3&id=$4 [L]

Sonraki yerine gibi sayfaları çağrı "example.com / index.php? Var = 1 & = 2 var ... Bu gibi" diyoruz "example.com/1/2 ..."

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*) index.php?page=$1&view=$2&action=$3&id=$4

Mod_rewrite'ı ama hiçbir şey gerektirir, tüm parametreler isteğe bağlıdır.