. php kaldırmak için mod_rewrite ama yine. php dosyasını hizmet?

3 Cevap php

Ben sadece mod_rewrite ile basit bir şey yapmak istedim. Ben. Php dosyalarını kullanan bir site var, ve ben temiz URL'ler için bu yeniden ve. Php kaldırmak istedim. Yani, dosya vb www.mysite.com / iletişim ve olacaktır.

Bu ben istedim, ama ben hala benim contact.php dosyayı hizmet, ama sadece onlar değil contact.php daha / temas vardı kullanıcıya göstermek saniyorlardi nasıl çalışır. Ama, orada değil ki, sadece iletişim adında bir dosya arıyor.

Peki, bu yüzden yapmam gereken, hala benim contact.php dosyasını kullanabilirsiniz, ancak / temas kullanıcı için URL yeniden yazma mı?

İşte kullanıyorum budur:

SetEnv APPLICATION_ENV development
RewriteEngine on
RewriteBase /

# Always use www.
RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC]
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301]

# Change urlpath.php to urlpath
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
RewriteRule ^(.*)\.php$ http://www.mysite.com/$1 [L,R=301]

3 Cevap

Bu çözüm için, aşağıdaki kuralları takip:

  1. Kullanıcı yüklemeye çalışırsa /something.php onlar dışarıdan /something yönlendirilir edilmelidir.
  2. Kullanıcı yüklemeye çalışırsa /something sonra dahili /something.php yönlendirilir edilmelidir.
  3. Kullanıcı URL herhangi bir sorgu dizesi parametrelerini geçerse o zaman bu yönlendirmelerin boyunca korunmuş olmalıdır.
  4. Kullanıcı gerçekten dosya sistemi (bir stil, görüntü vb) üzerinde bulunan farklı bir dosya yüklemeye çalışırsa o zaman bu kadar yüklü olmalıdır.

Ve burada mod_rewrite büyü nihai set bulunuyor:

RewriteEngine on
RewriteBase /

## Always use www.
RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC]
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301]

# Change urlpath.php to urlpath
## Only perform this rule if we're on the expected domain
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
## Don't perform this rule if we've already been redirected internally
RewriteCond %{QUERY_STRING} !internal=1 [NC]
## Redirect the user externally to the non PHP URL
RewriteRule ^(.*)\.php$ $1 [L,R=301]

# if the user requests /something we need to serve the php version if it exists

## Only perform this rule if we're on the expected domain
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
## Perform this rule only if a file with this name does not exist
RewriteCond %{REQUEST_FILENAME} !-f
## Perform this rule if the requested file doesn't end with '.php'
RewriteCond %{REQUEST_FILENAME} !\.php$ [NC]
## Only perform this rule if we're not requesting the index page
RewriteCond %{REQUEST_URI} !^/$
## Finally, rewrite the URL internally, passing through the user's query string
## using the [qsa] flag along with an 'internal=1' identifier so that our first
## RewriteRule knows we've already redirected once.
RewriteRule ^(.*)$ $1.php?internal=1 [L, QSA]

Üçüncü kural etrafında başka bir yol olmalı:

# Change urlpath.php to urlpath
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
RewriteCond %{REQUEST_FILENAME} !\.php$ [NC]
RewriteRule ^/?(.*)$ $1.php [L,R=301]

Kullanıcı / kişiye gider sonra, bu contact.php yük olacak. Insanlar contact.php gitmek DO, eğer contact.php.php yüklemeye çalışmayın böylece ekstra RewriteCond olduğunu

Ben anlamak gibi URL URL / contact.php olsa bile / contact olmak istiyorum.

Sen. Php uzantısı denetlemek ve kaldırmak için bir yönlendirme yapabilirsiniz. R = 301 (gibi) kullanın.

Sonra sunucu. Php uzantısı olmadan URL'yi kabul yapmak zorunda. Aslında zaten yapabilir.

İşte mod_negotiation yaptığı budur. Varsayılan olarak monte edilmelidir, ancak bunu sağlamak zorunda kalabilirsiniz.

Ayrıca mod_rewrite ile bunu, ama seçeneklerden R kaldırabilirsiniz. Bunun yerine bir HTTP yönlendirme ile cevap içten yönlendirir.