URL Yeniden Yazma Yardım

7 Cevap php

Thank you one and all for your patience and help. I am completely restating the question because it is getting quite long from all my revisions. I have an PHP MVC framework with 4 entry points:

from the root:
index.php
index-ajax.php
admin/index.php
admin/index-ajax.php

Ben herhangi bir isteği almak ve url dayalı ilgili dosyaya yeniden yazmak istiyorum bir. Htcaccess dosyası gerekli. Uzun url index.php olurdu? Rt = cms/view/15 ve ben index/cms/view/15 istedim. O kısmı hemen hemen bir gotcha dışında yapılır.

. İşte benim htaccess dosyası şimdi:

# htaccess file for framework - GOOD
Options +FollowSymLinks

# Turn on the mod_rewrite engine - GOOD
RewriteEngine On

# Hide indexes - GOOD
Options -Indexes

# If a file is not one of these, continue processing. - GOOD
RewriteRule \.(css|js|jpg|jpeg|png|gif|ico)$ - [L]

# RewriteRules for folder index files
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD

# RewriteRules for admin folder arguements - going from more specific to less
RewriteRule ^admin/ajax/[A-Za-z0-9-_/]*$ admin/index-ajax.php?rt=$1 [L]
RewriteRule ^admin/[A-Za-z0-9-_/]*$ admin/index.php?rt=$1 [L]

# RewriteRule for root ajax file
RewriteRule ^ajax/[A-Za-z0-9-_/]*$ index-ajax.php?rt=$1 [L]

# RewriteRule for root file - by here, it is not ajax or admin related, so only
# possible option left if the root index file
RewriteRule ^[A-Za-z0-9-_/]*$ index.php?rt=$1 [L]

Ben iki klasör ile basit bir site yaptık - 'root' ve 'root / admin', ve bu bir css, görsel ve bazı kukla içeriği ile javascript klasör her birinin içinde. Orada 'root' ve 'root / admin "içinde bir index.php ve dizin-ajax.php dosyası olduğunu basit çıkışlar ne olursa olsun url argümanı ve bir css, js ve klasörlerin her görüntü dosyasını kullanır.

Ben şimdi var sorun I endeksi / vesaire veya / admin / index / filan gibi bir url yaparsanız, o sayfa sağ sunar ve argüman doğru olmasıdır. Ben bir url yaptığımda css / js / images dosya dizin gidin çünkü Ancak endeks / bla / görünüm veya admin / index / blah / görünüm gibi daha sonra argüman doğru (? Rt = blah / görünüm) ama sayfa yanlış tanıtıyor / blah / [css] yerine index / [css] arasında.

Bu işlemek için nasıl herhangi bir fikir? Ben css / js / görüntü dosyalarını yüzden orada daha az iş olmazdı. Htaccess yoluyla olduğu gibi geçmesi için izin verdi.

7 Cevap

Eğer daha onlar kırıyorsun iç içe gidiyoruz şimdi HTML göreli bir URL kullanarak, ve çünkü böylece images / css / etc kırmak? Karşılaştığım diğer bazı MVC kurulumları ile, images / styles / komut gibi varlıkları için tüm yollar önek Görünüm bileşeni tarafından kullanılan bir "kök yolu" istek URL tabanlı Kontrolörü tarafından belirlenen çeşit değişken, genellikle var.

İşte bu sizin için kabul edilebilir bir çözüm ise, "/" s istek URL'yi patlayan parçaları sonuçlanan sayısını sayma, ve göreli bir inşa gibi bir şey yapıyor Kontrolörü yer alacağı, hangi Controller / PHP sorunun içine. Htaccess sorunu çıkıyor sonucundan URL.

Ben yaptım özel bir MVC kurulumu için benzer bir şey yaptı; http://avogadro.ws/hosted/skel/public/results/school-1 kontrol ve CSS yerleri için kafa kaynağına bakmak. Bu sayfa için CSS Kontrol göreli bir dizeye oluşturur http://avogadro.ws/hosted/skel/ düzeyinde aslında.

Eğer her şey index.php tarafından ele alınmalıdır emin misiniz? Ne vb images / css gibi statik dosyaları hakkında?

İşte İlginizi çekebilir alternatif bir yöntemdir. Zaten index.php dosyasına bir dosya veya dizin olarak yok herhangi bir URL iletmek ve sonra, örneğin, orada URL ayrıştırmak [Domain.com] / cms/view/15 [domain.com] / index.php/cms/view/15 için yeniden olacaktır. Sen AcceptPathInfo bu iş için Açık ayarlanmış apache direktif olması gerekir.

.htaccess:

RewriteEngine On
#check url is not a valid file
RewriteCond %{REQUEST_FILENAME} !-f
#check url is not a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
#rewite anything left
RewriteRule ^(.*)$ index.php/$1 [L]

index.php

$path = trim($_SERVER['PATH_INFO'], '/');
$pathParts = explode('/', $path);

if (isset($pathParts[0])) {
    $com = $pathParts[0];
} else {
    $com = 'defaultcom';
}

//$com[1] will be 'view' if supplied
//$com[2] will be 15 if supplied

Eğer apache yapılandırmasında URL tanımlamak ve anlamak zorunda değildir, ancak PHP işlerin çoğunu yapabilirim çünkü bu yaklaşım gibi.

Edit

Sen yerine. Htaccess olarak kullanabilirsiniz, bu PHP komut değil listedeki bir uzantısı ile herhangi bir isteği yönlendirme olur. RewriteCond yeniden ediliyor gelen yönetici klasöre istekleri durdurmak gerekir.

RewriteEngine On
#don't rewrite admin
RewriteCond %{REQUEST_URI} ^admin/
#rewrite anything with a file extension not in the list
RewriteRule !\.(js|gif|jpg|png|css|ico)$ /index.php [L]

(Ben senin soru düzenlemeden sonra yunuslama am) Sorunuzun noktası cevapsız ettik sürece birçok klasörler derin URL'ler için göreceli görüntü / css yolları düzeltmek gerekiyorsa gibi, bu sesler. Basit bir çözüm, göreli görüntü yolları kullanmayın! Sadece ileriye eğik çizgi ile resim / css bağlantıları başlatmak ..

<img src="/img/logo.png" alt="something" />

Ben her zaman çok sayfa öngörülemeyen klasör derinlikleri güç tek bir şablon olduğunda daha kolay bir yaklaşım buldum. Sürece yerel kalkınma için bir test URL gibi yerel ve üretim sunucuları için çalışıyor.

I like Tom Haigh said bunu ve PHP ile istenen URL yolunu ayrıştırma:

// extract the URL path
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// extract the path segments
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
// expected parameters and its default values
$params = array(
    'com'    => 'default',
    'action' => 'default',
    'val'    => 'default'
);
foreach ($params as $key => $val) {
    if (isset($segments[0])) {
        $_GET[rawurldecode($key)] = rawurldecode(array_shift($segments));
    } else {
        break;
    }
}
$restOfTheURLPath = implode('/', $segments);
var_dump($_GET);

Ve mod_rewrite kuralları:

# redirect every request, that cannot be mapped to an existing file, to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin(/|$) admin/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Edit Yorumlarınız ve şimdi düzenlenebilir soruya cevaben: Sen yeniden yazma süreci biter önünde bir kural ile istediğiniz dizinleri dışarıda:

RewriteRule ^(css|images)/ - [L]
RewriteRule ^admin/index\.php$ - [L]
RewriteRule !^index\.php$ index.php [L]

Peki, bu tür bunu mahveder ortasına koymak $ dışında, oldukça iyi görünüyor; Bir $ yüzden doğru işe yarayacağını sanmıyorum regex sonunu.

Ayrıca, ben ileriye eğik kaçmak gerekebilir düşünüyorum, ama emin değilim.

# htaccess file for framework - GOOD
Options +FollowSymLinks

# Turn on the mod_rewrite engine - GOOD
RewriteEngine On

# Hide indexes - GOOD
Options -Indexes

# If a file is not one of these, continue processing. - GOOD
RewriteRule ^images/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^images/admin/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^admin/(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ admin/images/$3.$4 [L]
RewriteRule ^(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ images/$3.$4 [L]

# RewriteRules for folder index files
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD

# RewriteRules for admin folder arguements - going from more specific to less
RewriteRule ^admin/ajax/([A-Za-z0-9\-_/]*)$ admin/index-ajax.php?rt=$1 [L]
RewriteRule ^admin/([A-Za-z0-9\-_/]*)$ admin/index.php?rt=$1 [L]

# RewriteRule for root ajax file
RewriteRule ^ajax/([A-Za-z0-9\-_/]*)$ index-ajax.php?rt=$1 [L]

# RewriteRule for root file - by here, it is not ajax or admin related, so only
# possible option left if the root index file
RewriteRule ^([A-Za-z0-9\-_/]*)$ index.php?rt=$1 [L]

Linux / apache sunucu üzerinde dizin ve dosya kurulumu ile test ederken yukarıda. Htaccess çalışıyor

Ben / ajax / merhaba / dünya / images / görüntülerine gidin ve yönetici klasörde ise o / admin / images gidecek bir görüntü için bir istekte Yeniden yazmaya görmezden-görüntüleri satır yerini

Son satırı muhtemelen olmalıdır:

RewriteRule ^/([A-Za-z\-_]+)/([A-Za-z\-_]+)/([A-Za-z0-9\-_]+)$ /index.php?com=$1&action=$2&val=$3 [L,R]