2011-06-14 3 views
7

Ben aşağıdaki URL aşağıdaki dönüştürmek istediğiniz ...Kuralları nasıl maç için mod_rewrite alabilirsiniz sadece bir kez

http://localhost/http.mygarble.com/foundationsofwebprogramming/86

...:

http://localhost/http.mygarble.com/php/blog.php?subdomain=foundationsofwebprogramming&page=posts&label=86

RewriteRule ([^/]+)/([^/]+)$ php/blog.php?subdomain=$1&page=post&label=$2 [NC,L] 
01:

Ben şu kuralla bunu başarmak düşündümAncak, bulduğum şey, bu kuralın art arda uygulanmış olmasıdır; bu da bir iç sunucu hatasıyla sonuçlanır. URI bu kuralı kullanarak dönüştürüldüğünde, ortaya çıkan URI'nin de kural ile eşleşeceğini ve dolayısıyla tekrar ad-infinitum uygulandığını anlıyorum.

Daha önceki (daha doğrusu oldukça anlayışlı) anlayışım, [L] bayrağının daha fazla işlemeyi durduracağıydı, ancak şimdi bunun sadece kuralların geri kalanının atlandığını ve yeniden yazma motorunu durdurmadığını anladığımı anladım. kurallar aracılığıyla tekrar.

Ben

RewriteCond $0 !php/blog.php 
RewriteRule ([^/]+)/([^/]+)$ php/blog.php?subdomain=$1&page=post&label=$2 [NC,L] 

... ya da daha spesifik normal ifade yazarak ... Aşağıdaki koşul ekleyerek bu sorunu çözebilirsiniz. Ama gerçekten yapmak istediğim, bu kural bir kez eşleştirildiğinde, yeniden yazma motorunun başka eşleşme girişiminde bulunmasını engellemenin bir yolunu bulmak. Mümkün mü?

Çok teşekkürler.

cevap

16

Genellikle 2 yöntem kullanılır.

İlki, istenen dosyanın gerçek bir dosya olmadığı bir Yeniden Yazma Koşulu testi. Dahili özyineleme ortaya çıktığında php/blog.php dosyanız gerçek bir dosyadır ve yeniden yazma işlemi 2 kez gerçekleştirilmez. Yan etki (iyi yan etkisi olabilir) yeniden yazılması olmayacak Varlığından bir dosya için herhangi bir istek

RewriteCond %{REQUEST_FILENAME} !-f 

ikinci çözümdür Eğer bir iç yönlendirme değiliz kontrol etmek olmasıdır:

Bu 2. çözümün yan etkisi, daha önce başka kurallar uygulanıyorsa (aslında yeniden yazmanın ilk geçişinden sonra bazı dahili yönlendirme işlemlerinin yürütülmesini istiyorsanız) yeniden yazma kuralının uygulanamamasıdır.

Düzenleme

tamamlanması için bir üçüncü yöntemi katacak: [NS] veya [nosubreq] etiketi aynı şeyi yapıyor gibi görünüyor. Dahili yeniden yönlendirme sonrasında kural kullanımının engellenmesi.

+0

İkinci çözüm idealdir. İstediğim tek yönlendirmeler harici olanlardır, tüm kuralların yalnızca bir kez çalıştırılması gerekir. Teşekkürler. –

+0

Maalesef cevabınızı oylamada bir itibara sahip değilim, belki birisi benim adıma yapar. Tekrar teşekkürler. –

+0

@James Smith: Cevabımı kabul etmenize gerek yok, sadece "kabul etmelisiniz" (böylece yeşil işaretlemeye sahibim). – regilero

4

Ve üçüncü yöntem apache'yi 2.3.9 veya üzerine yükseltmek ve [L] yerine [END] bayrağını kullanmaktır.

Yan etki yok