Apache mod_rewrite ve PHP GET Diziler

5 Cevap php

I want to have a url like http://localhost/folder1/folder2/folder3/file Then i want mod_rewrite to convert it to $_GET['d'] in the url it would look like d[]=folder1&d[]=folder2&d[]=folder3

Bu mümkün mü?

Teşekkür ederiz.

5 Cevap

Ben otomatik olarak yapmak için bir yol bilmiyorum, ama istenen URL $ _SERVER ['REQUEST_URI'] oldu ne almak ve istediğiniz bilgileri ayıklamak için üzerine kendi dize işlem gerçekleştirebilirsiniz.

Bu benim seviyelerde sınırsız miktarda Seach Motoru Dostu URL'ler için ne olduğunu. Aynı zamanda size sorgu dizeleri veya izin seçeneği verir ve görüntüler, CSS ve JavaScript gibi gerçek klasörlere veya dosyalara adresler yeniden yazacak değil.

Apache ...

# Do not use htaccess if you can avoid it, instead write all of this in the httpd.conf <VirtualHost /> and disable .htaccess for performance/security.
RewriteEngine On
RewriteBase /

# Redirect non-www traffic to www.domain.co.uk/request
RewriteCond %{HTTP_HOST} !^www\.domain\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.domain.co.uk/$1 [R=301,L]

# Do not rewrite real files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*/ - [L]

# Use 1 or 2 Below

# 1. SEO Friendly URLs (don't allow additional query strings /foo/bar/)
# RewriteRule ^([A-Za-z0-9/-]*)$ index.php?request=$1 [L]

# 2. SEO Friendly URLs (allow additional query strings /foo/bar/?q=search)
RewriteRule ^([A-Za-z0-9/-]*)$ index.php?request=$1 [L,QSA]

PHP ...

<?php

/*
    Title: Request
    Gets the client request and sanitizes the user input.

    Returns:
    	Array of parts of the URL.

    	> $request = /path/to/page/
    	> var_dump($request);
    	> array(3) { [0]=>  string(4) "path" [1]=>  string(2) "to" [2]=>  string(4) "page" }
*/

// Check request exists
if (isset($_GET['request']) && !empty($_GET['request']))
{
    // Yes. Sanitize request.
    // request should be made lowercase, as URLs should not be case-sensitive.
    $request = strtolower($_GET['request']);

    // Sanitize request incase the user tries to circumvent the .htaccess rules and uses the query string directly. index.php?request=
    $request = preg_replace("([^a-z0-9-/])", '', $request);

    // Check if request ends with trailing slash to ensure all crawled URLs end with a trailing slash. ($request does not include other query strings or anchors)
    if ((substr($request, -1, 1)) == '/')
    {
    	// Yes, request should now be safe to use.
    	$safe['url'] = $request;

    	// Split request into an array with values for each directory.
    	$safe['request'] = explode('/', $request, -1);

    	// Destroy user input to prevent usage.
    	unset($_GET['request'], $request);
    }
    else
    {
    	// No, redirect to request with trailing slash.
    	header('Location: /' . $request . '/', true, 301);
    	exit;
    }
}
else
{
    // No.
    $safe['request'] = false;
}

?>

Daha sonra uygun fonksiyonları ile isteği işleyen bir yönlendirme dosyası var. Bu kodu bir sürü gibi görünüyor ama ben sadece istek gerektirir sınıfları / işlevleri dahil olarak organize ve verimli tutmak yardımcı olur belki.

Benim projeler için kullanılacak böylece GPL v3 kodunu kullanmak için çekinmeyin (ağladığını duymak başka bir çerçeve değil, Urgh) kodu kütüphanesinin serbest düşünüyorum.

Umarım bu yardımcı olur.

Bu size ihtiyacınız olan şeyi bir fikir vermelidir ...

Rewrite Rule ^(.*)/(.*)/(.*)/(.*)$ /my_script.php?d[]=$1&d[]=$2&d=$3&f=$4

Eğer bir dizin keyfi sayıda, yerine 3 sabit dizinleri desteklemek istiyorsanız, bu tamamen başka bir konu olacak.

Kullanmak için iyi bir tekniktir bir ön denetleyicisi (MVC tasarım deseni parçasıdır.) Bir ön denetleyicisi, web sitenizin aldığı her isteği yönlendirilen bir (PHP) dosyasıdır. Ön Kontrolör daha sonra istek tür (vb, sayfa X'te formu Y sunulması bakmak) bağlı olarak diğer dosyalara isteği gönderir. Örneğin @ Ray Hidayat tarafından açıklanan tekniği kullanarak, istek url "kesip" olabilir, ve isteği işlemek ve ya cevap vermelidir sitenizin hangi parçası belirlemek için bakmak.

Örneğin: Zend Framework ve Drupal hem de bu tekniği kullanabilirsiniz. Bu gibi durumlarda, ve ben çoğu durumda, sitenin kök index.php ön kontrolör olduğunu düşünüyorum, bu yüzden www.example.com / index.php

Bunu ön denetleyicisi yönlendirmek için her isteği mod_rewrite kullanabilirsiniz.

RewriteEngine on
RewriteRule .* index.php

Sen images / files / CSS ve javascript kütüphanesi için aşağıdaki mod_rewrite komut dosyası kullanabilirsiniz.

RewriteEngine off

İyi şanslar!