Arama motoru dostu URL'ler için özyinelemeli mod_rewrite

4 Cevap php

Ben yapmaya çalışıyorum ne benzer bir özyinelemeli mod_rewrite soruna bir previous solution aracılığıyla okuma oldum, fark ben 'bir index.php dosyası üzerinden tüm sorgu gönderme ve bu nedenle don kulüpler olduğunu t sorgu içinde komut dosyası belirtmek gerekir.

Esasen ben yinelemeli bir arama motoru dostu url içindeki herhangi bir sayıda parametre dönüştürmek istiyorum:

example.com/param1/val1/param2/val2/...

düzenli bir sorgu dizesi:

example.com/index.php?param1=val1&param2=val2&...

Şimdiye kadar olsa benim girişimleri başarısız oldum:

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/([^/]+) $1=$2&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?%1 [L]

Herkes herhangi bir öneriniz sunmak mümkün olacaktır?

4 Cevap

Ben diğer soruda çözüm kopyalanan ve bu gibi değiştirilmiştir:

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)?([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^.*$ index.php?%1 [L]

Bu ilk kural dışında, ilk maç isteğe bağlıdır ve ikinci kural, maç tüm diğer çiftleri eşleştirilir sonra kalan ne olursa olsun üzerinde, hemen hemen aynı şeyi yapar.

Parametrelerin bir tek sayı için, ilk parametre göz ardı edilir.

Eğer parametrelerin çok olmasını bekliyoruz, bir not, bazı ayarları değiştirmeniz gerekebilir.

Senin. Htaccess dosyasına Zsh'da

RewriteOptions MaxRedirects=20

ve apache conf dosyasına böyle bir şey

LimitInternalRecursion 20

Yerine "20" Eğer (varsayılan 10) izin vermeniz gerekir recursions (çift) ne olursa olsun sayı seçin.

Bu çok eski bir konu olduğunu anlıyoruz. Burada yayınlanan cevapların hiçbiri benim için çalıştı ve isterlerse ziyaretçi kullanabilirsiniz böylece benim cevap göndermek istiyorum çünkü Ama ben burada cevap veriyorum:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA,DPI]
RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA,DPI]

Daha fazla ayrıntı için MOD_REWRITE for URL variables, removing empty parameters and using more than 1field for the first and second variables benim cevaba bakınız

evet ...

Burada örneklerden alınan:

http://iirf.codeplex.com/sourcecontrol/changeset/view/62027?projectName=IIRF#981491

Bu kuralkümesi iteratif bir sorgu dizesi n = v kesimine URL yolu kesimleri bir çift çevirir.

# handle case with no query string.  This rule fires the first time through,
# and converts the first pair of URL path segments to a n=v query string segment.  
RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)/([^\?]+)$ /$3?$1=$2

# handle the case where there is an existing query string, and more than one pair of 
# URL path segments remaining. This rule fires potentially multiple times.
RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)/([^\?]+)\?(.+)$ /$3?$4&$1=$2


# Handle the case with a query string, and exactly one pair of URL path segments. 
# This fires once (last).
# It fires when there is an even number of segments. 
RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)\?([^\?]+)$ /help.cfm?$3&$1=$2  [L]

# Handle the case with no query string, and exactly one pair of URL path segments. 
# This fires once (last).
RewriteRule ^/(?!index\.php)([^\?\/]+)/([^\?\/]+)$ /help.cfm?$1=$2  [L]


# Handle the edge case, where there is an odd number of segments, which is invalid
# for these purposes. 
#
# This fires once, after all the other pairs have been parsed.  In fact the filter
# cannot know that there is an odd number of segments until it does all the matching.
# So at the end we see, we have one left over segment, and we 
# redirect to a 404 page.

RewriteRule ^/(?!index\.php)([^\/\?]+)\?([^\?]+)$ /ResourceNotFound.php  [L]

# Handle the edge case where there is only one segment. This is also an error
# in this ruleset.
RewriteRule ^/(?!index\.php)([^\/\?]+)$ /FoundOnlyOneSegment.php  [L]

Bu kuralkümesi ne istediğinizi tam olarak olmayabilir ama bu yaklaşımı göstermektedir. Bu ancak IIS için bir yeniden yazma olan IIRF, için, mod_rewrite'ı için geliştirilmiş değildi. Ancak sözdizimi mod_rewrite için aynı olmalı, bu yüzden bu kurallar sadece çalışmak gerekir.

Ben mod_rewrite bir günlüğü tesis, ya da bir komut satırı test yeteneğine sahip olmadığını bilmek, ama IIRF does, daha kolay bireysel kuralları nasıl çalıştığını görmek için yapar, ya da kurallar setleri sonuç yok.

IIRF 10 varsayılan. Oldukça yüksek, ama yine de sonsuz olmadığı, 30 bu limiti yükseltmek için bir yol var ki, bir yineleme sınırı vardır. Yani "parametrelerinin herhangi bir sayı" için çalışacak anlamına gelir. Bu params 15 çifte kadar dönüştürebilirsiniz. Mod_rewrite benzer bir limiti varsa ben bilmiyorum.

Bu kuralları deneyin:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^([^/]+)/([^/]+)(/(.*))?$ /$4?$1=$2 [N,QSA]
RewriteRule ^$ index.php [L]

İlk kural, mevcut dosyalar için istekleri dışlamak olduğunu. İkinci kural işi yapmak ve her ad ve değer çifti yeniden. Ve üçüncü kural index.php için son URI yeniden yazmak için.