2009-10-10 15 views
10

Bir .htaccess dosyasında bir şey ama özel bir dize eşleştirmek için kullanılan bir kural oluşturmaya çalışıyorum, bu durumda: index. .htaccess rewrite regex: bir şeyle eşleşir "

Ben ilk bu özel dizeyle eşleşen ve [L] kullanmak mümkün olmalıdır ama bu,
çalışmıyor ve aşağıdaki regex kullanarak mümkün olması gerektiğini düşündüm, ama 500 hatası neden olur.

Ben eşleştirmek istiyorum:

  • pagename1
  • pagename2/ne olursa olsun
  • pagename3/234/ne olursa olsun
  • yaklaşık
  • kontak-us
  • (vs)

ama n ot

  • endeksi/123
  • endeksi/124/ne olursa olsun

(BTW "endeks" hayır uzantısı değil, benim seçimim ile bir dosyanın adıdır, bu çalışma şey)

^(?!index)[\w/\-]+ 

Apache'nin regex uygulamasının (?!xxx) kuralı ile baş edemediğini varsayalım.

Herhangi bir yardım/öneri çok takdir edilecektir.

cevap

15

Örneğin, bunu yapmak için RewriteCond s kullanabilirsiniz: endeksine göre başlamaz her URL'yi yeniden yazacak

RewriteCond %{REQUEST_URI} !^index 
RewriteRule (.*) index.php?what=$1 

. URL'de herhangi bir yerde sakınmak istiyorsanız, ^

+0

Bunu sadece "!^Index" yerine "! Index" kullanarak çalışacak duruma getirdim. (Ve evet, "index", yukarıdaki jezmck sorgusunda olduğu gibi, istek dizgisinin başlangıcıydı). Bunun neden böyle olabileceği konusunda bir fikrin var mı? – rinogo

+1

Çözüldü. Bir alt dizinde çalışıyor olsanız bile, "RewriteCond% {REQUEST_URI}" kullanarak tüm istek URI'sini kullanır, böylece mevcut dizinin www yolunu dahil etmeniz gerekir. Benim durumumda, bu kullandığım anlamına gelir: "RewriteCond% {REQUEST_URI}! ^/R/index $" (çalışıyorum .htaccess dosyası 'r' dizininde). – rinogo

3

(yorumlarınızı okuyunuz Sanmam ve ben bir sorunla karşılaşmadım hiç, Biri .htaccess dosyaları daha temiz verirken, fakat:. Kullanılarak RewriteCondolabilir nedeniyle rulesets are processed nasıl bir çizgi ile RewriteRule kullanılmasına göre tercih edilebilir ?)

Sadece index/ ile başlar her şey için müteakip yeniden yazma ([L]) değil yeniden yazma (çizgi) için, aşağıdaki gibi RewriteRule kullanın ve durdurma:

# Do not rewrite anything that starts with index/ 
RewriteRule ^index/ - [L]

Bundan sonra, beğendiğiniz yeniden yazma işlemini yapın.

Ya da belki hatta biraz daha ilk sınırlamak:

# Do not rewrite files, directories or symbolic links 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule . - [L]
+0

Ah o aradığım cevap iyi olabilir, '' '' 'in hakkında bilgi sahibi olmadım .htaccess – jezmck

+1

Conds daha güvenlidir. Endeksle eşleşen bir kuralınız varsa daha sonra şeyler garipleşebilir. [L] son ​​geçiş değil, sadece geçerli geçişi sonlandırır, isteğin kurallar üzerinden bir kereden fazla geçtiği çeşitli durumlar vardır. –

+0

@ Vinko, çoklu geçişler gerçekten akılda tutmak için iyidir. Fakat bir RewriteCond (özellikle bir negatif RewriteCond), başka bir geçişte nasıl garip maçlara maruz kalmaz? – Arjan

1

Apache'yi üç farklı düzenli ifade uygulaması gerçekleştirin. Birincisi System V8 idi, çünkü Apache 1.3 POSIX ERE kullanıyordu ve Apache 2 de PCRE kullanıyorlardı.Ve sadece PCRE ileriye dönük iddiaları desteklemektedir. Yani bu kuralı kullanmak için Apache 2'ye ihtiyacınız var.

Ama şimdi sorunuza. /index/ bu kuraldan catched edilmeli ve başka kural uygulanmalıdır ile başlar

RewriteRule ^index/ - [L] 

şey: Bu kuralı kullanın.

Ama bu işe yaramazsa, bu deneyin:
RewriteRule !^index/ … 

Yine, bu kural /index/ ile başlamaz URL yolu var herhangi istek üzerine uygulanacaktır.

Ve URL'den şey yakalamak istiyorsanız, tam URL yolunu kendisi (%{REQUEST_URI}) veya desen gruplarından birinin sadece eşleşmeyi test etmek için RewriteCond koşulunu kullanın:,

RewriteCond %{REQUEST_URI} !^/index/ 
RewriteRule (.*) … 
# or 
RewriteCond $1 !^index$ 
RewriteRule ^([^/]+)/(.*) …