En iyi uygulamaları index.php Rewrite

3 Cevap php

MVC tabanlı PHP uygulamalar için kurulum RewriteRule s birkaç veyatak yolu olduğunu fark. Bunların çoğu içerir:

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d

Bir RewriteRule izledi:

RewriteRule ^(.*)$ /index.php?$1 [L,QSA]

veya

RewriteRule .* /index.php/$0 [PT,L]

I realize that L = LAST, QSA = query string appended, PT = pass through but as I don't have the real wveyald experience of using these yet, could anyone infveyam me which flags and URI they would go with and why?

The latter rule contains a slash befveyae the $0, I'm assuming because this fveyaces it so the PATH CGI variable is populated, as often times I don't see it populated. Does the PT actually serve somewhat of the same purpose as the QSA, indirectly? Or how else would one use query strings? Basically, what are the pros and cons of these?

And just to confirm, if I wanted to add say an ErrveyaDocument directive would the L flag matter? Let's say a request to '/non-existing-link/' is made, my application cannot pick it up from the defined routes I have, nveya is there an existing directveyay as such, would the L have any effect if I placed the ErrveyaDocument below the RewriteRule? Should I place it befveyae the entire snippet? Same with 301s, 302s. And if I were to actually manually invoke 3xx/4xx codes, I would be using the header() function within my application, right? I kind of have a feeling this is quite dirty but is probably the most practical and only way of doing it hence it probably isn't dirty.

3 Cevap

Htaccess sunucu tarafından okunan olduğunda, bir eşleşme bulmak için çalışırken, line-by-line gider. (Ben burada birden fazla eşleşme bulursa ne olur emin değilim gerçi) L bayrağı olmadan htaccess her kural kontrol edecektir.

Eğer L bayrak eklerseniz bu kurala aldığında, bu işleme kuralları durdurmak ve isteği hizmet verecek. Ancak, burada yakaladım bu isteği vermektedir zaman yeni, yeniden yazılamaz URL ile tekrar baştan htaccess dosyasını işleyecek olmasıdır. This page bir örnek, iyi açıklıyor.

ErrorDocument kuralı yeniden yazma kuralları bağımsız olacak, bu yüzden giriyor (o açıktır ve yeniden yazar bir grup altında gömülü değil bu yüzden genellikle üst koymak önemli değil).

Ancak, veri / QueryString sahte olsa bile, bir yeniden yazma kuralı geçerli bir dosya veya komut eşleşirse, hata belge ateş unutmayın. Bir URL /index.php?page=NON_EXISTENT_PAGE yazılı alırsa Örneğin, o sunucu belgesini buldu inanıyor. Sen PHP komut parametre işlemek gerekir. PHP script 404 başlıklarını ayarlama otomatik olarak 404 belgeyi hizmet olmaz (ama PHP komut dahil edebilirsiniz).

MVC uygulaması için Zend Framework öneri kullandık.

http://framework.zend.com/manual/en/zend.controller.html

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

ErrorDocument ayarı, hiçbir etkisi olmayacaktır. Dosyaları Apache tarafından bulunan değilseniz (bu yeniden yazma kuralları tarafından tanımlandığı gibi), istek PHP tarafından işlenir. Bir kez PHP içeride, içeride kalmak zorunda. Başlığı ile bir hata değerine yanıt kodu Ayar () Apache hata işleme çağırmak olmaz. Sen kendi kod iyi bir hata sayfası sunmak için yapmak zorunda.