Soru Yönlendir, URL'leri Değiştirin veya HTTP'yi Apache'de HTTPS'ye Yeniden Yönlendirin - Mod_Rewrite Kuralları Hakkında Bilmek İstediğiniz Her Şey Ama Sormaktan Korktuğunuz Her Şey


Bu bir Kanonik Soru Apache'nin mod_rewrite hakkında.

Bir istek URL'sini değiştirmek veya kullanıcıları orijinal olarak istedikleri dizinden farklı bir URL'ye yönlendirmek mod_rewrite kullanılarak yapılır. Bu gibi şeyler içerir:

  • HTTP'yi HTTPS'ye (veya başka bir şekilde) değiştirme
  • Yeni bir yedekte artık olmayan bir sayfaya bir istek değiştirme.
  • Bir URL biçimini değiştirme (? İd = 3433 - / id / 3433 gibi)
  • Tarayıcıya dayalı farklı bir sayfa sunmak, refara göre, ay ve güneş altında mümkün olan her şeye dayalı olarak.
  • URL ile uğraşmak istediğiniz her şey

Mod_Rewrite Kuralları Hakkında Bilmek İstediğiniz ama Sormaktan Korktuğunuz Her Şey!

Mod_rewrite kurallarını yazarken nasıl uzman olabilirim?

  • Mod_rewrite kurallarının temel formatı ve yapısı nedir?
  • Düzenli ifadelerin hangi biçimini / çeşidini sağlam bir kavrayışa ihtiyacım var?
  • Yeniden yazma kuralları yazarken en yaygın hatalar / tuzaklar nelerdir?
  • Mod_rewrite kurallarını test etmek ve doğrulamak için iyi bir yöntem nedir?
  • Bilinmesi gereken mod_rewrite kurallarının SEO veya performans etkileri var mı?
  • Mod_rewrite'nin iş için doğru araç gibi göründüğü, ancak böyle bir durumun olmadığı yaygın durumlar var mıdır?
  • Bazı yaygın örnekler nelerdir?

Kurallarınızı test etmek için bir yer

htaccess tester web sitesi kuralları ile oynamak ve onları test etmek için harika bir yerdir. Hata ayıklama çıktısını bile gösterir, böylece neyin eşleştiğini ve neyin eşleşmediğini görebilirsiniz.


257
2017-12-20 16:59


Menşei


Bu sorunun ardındaki fikir, daha düzenli kullanıcılarımızı çıldırtan tüm sonsuz mod_rewrite soruları için yakın bir yol vermektir. Bu, alt ağda yapılana çok benziyor serverfault.com/questions/49765/how-does-subnetting-work . - Kyle Brandt♦
Ayrıca, bu konuda pek fazla yorum istemiyorum sorudaha ziyade cevaba gitmeliler. Bunu yapmak istemiyorum çünkü posterin umduğum şey için tam kredi aldığından emin olmak istiyorum. mod_rewrite sorularının tümünü bitirmek için mod_rewrite yanıtı. - Kyle Brandt♦
Üzgünüm, soruyu bastım. ;-) Gerçekten de (veya yakın) tepesinde göstermek gerektiğini düşünüyorum mod-rewrite etiket arama / filtreler. - Steven Monday
Birisi Else (tm) ortak kullanım durumlarını ele almalıdır. Onları adalet için yeterince iyi tanımıyorum. - sysadmin1138♦
Belki de bu soru yolu daha da kısaltmak için mod-rewrite tag wiki'ye bağlanmalıdır. - beldaz


Cevaplar:


mod_rewrite sözdizimi sırası

mod_rewrite işlemeyi etkileyen bazı özel sipariş kurallarına sahiptir. Bir şey yapılmadan önce, RewriteEngine On Bu mod_rewrite işlemeyi başlattığı için direktifin verilmesi gerekiyor. Bu, başka herhangi bir yeniden yazma direktifinden önce olmalıdır.

RewriteCond önceki RewriteRule Bir kuralın şartlı duruma tabi olmasını sağlar. Aşağıdaki RewriteRules, koşullara tabi olmadıkları gibi işlenir.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

Bu basit durumda, HTTP yönlendiricisi serverfault.com'dan geliyorsa, blog isteklerini özel sunucu hatası sayfalarına yönlendirin (biz sadece bu kadar özeliz). Ancak, yukarıdaki bloğun fazladan bir RewriteRule hattı varsa:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

Tüm .jpg dosyaları özel serverfault sayfalarına gider, sadece buradan gelen bir yönlendirici ile değil. Bu açıkça, bu kuralların nasıl yazıldığının amacı değildir. Birden çok RewriteCond kuralları ile yapılabilir:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Ama muhtemelen bazı daha zorlayıcı sözdizimi ile yapılmalıdır.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

Daha karmaşık RewriteRule, işleme koşullarını içerir. Son parantez, (html|jpg) RewriteRule’e eşleşmesini söyler. html veya jpgve yeniden yazılan dizede eşleşen dizeyi $ 2 olarak göstermek. Bu, iki RewriteCond / RewriteRule çiftiyle önceki blokla mantıksal olarak aynıdır, sadece dört yerine iki satırda yapar.

Birden çok RewriteCond satırı örtülü ANDED'dir ve açıkça ORed olabilir. ServerFault ve Super User'dan (açık OR) gelen yönlendiricileri işlemek için:

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

Chrome tarayıcılarıyla birlikte ServerFault başvurulan sayfaları sunmak için (örtük AND):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBase ayrıca aşağıdakileri belirttiği kadar spesifiktir RewriteRule Direktifler işlemlerini yürütür. .Htaccess dosyalarında çok kullanışlıdır. Kullanılırsa, bir .htaccess dosyasında "RewriteEngine on" altındaki ilk yönerge olmalıdır. Bu örneği al:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Bu mod_rewrite, şu anda işleme koyduğu bu özel URL'nin yoldan geldiğini anlatıyor. http://example.com/blog/ fiziksel dizin yolu yerine (/ home / $ Username / public_html / blog) ve buna göre davranır. Bundan dolayı, RewriteRule URL'deki "/ blog" un ardından dizgin-başlangıcı olduğunu düşünür. İşte aynı şey iki farklı yolla yazılmış. RewriteBase ile biri, diğeri ise:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Gördüğün gibi, RewriteBase Web’ten yararlanmak için kuralların yeniden yazılmasını sağlar.yer Web'den ziyade içeriğe giden yolsunucuBu tür dosyaları düzenleyenlere daha kolay anlaşılabilir. Ayrıca, estetik çekiciliği olan direktifleri kısaltabilirler.


RewriteRule eşleme sözdizimi

RewriteRule kendisinin dizeleri eşleştirmek için karmaşık bir sözdizimine sahiptir. Başka bir bölümde bayrakları ([PT] gibi şeyler) kapsayacağım. Çünkü Sysadmins, örneğin bir adam sayfalık Örnek vereceğim ve ne yaptıklarını açıklayacağım.

RewriteRule ^/blog/(.*)$    /newblog/$1

.* inşa herhangi bir karakterle eşleşir (.) sıfır veya daha fazla kez (*). Parantez içinde saklamak, $ 1 değişkeniyle eşleştirilen dizeyi sağlamasını söyler.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

Bu durumda, ilk. * Parens içinde kapalı DEĞİL, bu yüzden yeniden yazılan dizeye verilmez. Bu kural, yeni blog sitesinde bir dizin seviyesini kaldırır. (/blog/2009/sample.html, /newblog/sample.html olur).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

Bu durumda, ilk parantez ifadesi eşleşen bir grup oluşturur. Bu, gerekli olmayan ve bu nedenle yeniden yazılan dizede kullanılmayan $ 1 olur.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

Bu durumda, yeniden yazılan dizede 1 $ kullanırız.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

Bu kural, bir karakteri belirten özel bir parantez sözdizimi kullanır. menzil. [0-9], 0 ile 9 arasındaki rakamları eşleştirir. Bu özel kural, 2000'den 2099'a kadar olan yılları işleyecektir.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

Bu, önceki kuralla aynı şeyi yapar, ancak {2} kısmı, önceki karakterle (bu durumda bir parantez ifadesi) iki kez eşleşmesini söyler.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

Bu durum, ikinci eşleşen ifadedeki küçük harflerle eşleşecek ve bunu olabildiğince çok karakter için yapacaktır. \. Yapı, periyodu gerçek bir dönem olarak ele almayı, önceki örneklerde yer alan özel karakteri değil söyler. Bununla birlikte, dosya adının içinde tire işareti varsa kırılır.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

Bu, dosya adlarını içlerindeki tire işaretleriyle yakalar. Ancak, - Braket ifadelerinde özel bir karakterdir. ilk ifadedeki karakter.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Bu sürüm, herhangi bir dosya adını harf, sayı veya - dosya adındaki karakter. Braket ifadesinde çoklu karakter kümelerini böyle belirtirsiniz.


RewriteRule bayrakları

Yeniden yazma kuralları üzerindeki bayrakların bir dizi özel anlamları ve kullanım alanları vardır..

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

Bayrak [L] Yukarıdaki ifadenin sonunda. Birden çok bayrak, virgülle ayrılmış olarak kullanılabilir. Bağlantılı belgeler her birini açıklar, ancak burada yine de vardır:

L = Son. Bu bir kez eşleştiğinde RewriteRules işlemini durdurun. Emir sayımı!
C = Zincir. Bir sonraki RewriteRule işlemeye devam edin. Bu kural eşleşmezse, sonraki kural yürütülmez. Daha sonra bunun üzerine.
E = Ortam değişkenini ayarlayın. Apache, web-sunucu davranışını etkileyebilecek çeşitli çevresel değişkenlere sahiptir.
F = Yasaktır. Bu kural uyuşuyorsa 403-Yasak bir hatayı döndürür.
G, = Gitti. Bu kural uyuşuyorsa 410-Gone hatası döndürür.
'H = İşleyici. İstek, belirtilen MIME türüymiş gibi ele alınmasını zorlar.
N- = İleri. Kuralın yeniden başlamasını ve yeniden eşleşmesini zorlar. DİKKATLİ OL! Döngüler olabilir.
NC = Durum yok. verir jpg jpg ve JPG hem de eşleştirmek için.
NE = Kaçış yok. Özel karakterlerin (.? # & Etc) onaltılık kod eşdeğerlerine yeniden yazılmasını önler.
NS = Alt sorgu bulunamadı. Sunucu tarafı içerenler kullanıyorsanız, bu, dahil edilen dosyaların eşleşmesini engeller.
P = Proxy. Kuralın mod_proxy tarafından işlenmesini zorlar. Web sunucunuz onu getirdiği ve yeniden sunacağı için, diğer sunuculardan içerik sağlamak. Bu, tehlikeli bir bayraktır, çünkü kötü yazılmış bir kişi web sunucunuzu bir açık proxy'ye dönüştürür ve bu da Kötüdür.
PT = Geçiş. RewriteRule eşleştirmesinde Alias ​​ifadelerini dikkate alın.
QSA = QSAppend. Orijinal dize bir sorgu içerdiğinde (http://example.com/thing?asp=foo) özgün sorgu dizesini yeniden yazılan dizeye ekler. Normalde atılır. Dinamik içerik için önemli.
R, = Yönlendir. Belirtilen URL'ye bir HTTP yönlendirmesi sağlayın. Tam yönlendirme kodu da sağlayabilir [R = 303]. Çok benzer RedirectMatchDaha hızlı ve mümkün olduğunda kullanılmalıdır.
S = Atla. Bu kuralı atla.
T = Yaz. Döndürülen içeriğin mime türünü belirtin. Çok benzer AddType direktif.

Bunu nasıl söylediğimi biliyorsun. RewriteCond tek ve bir kural için geçerli midir? Eh, bunu zincirleme yaparak alabilirsiniz.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

İlk RewriteRule zincir bayrağına sahip olduğundan, ilk yeniden yazma işlemi sırasında ikinci yeniden yazma kuralı yürütülür, önceki RewriteCond kuralı eşleştiğinde gerçekleşir. Apache düzenli ifadeler beyninizi incitirse Handy. Bununla birlikte, ilk bölümde işaret ettiğim hepsi bir arada yöntem I optimizasyon açısından daha hızlıdır.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Bu bayraklar yoluyla daha kolay yapılabilir:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

Ayrıca, bazı bayraklar RewriteCond için de geçerlidir. Özellikle NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

"ServerFault.com" ile eşleşecek


219
2017-12-20 17:44



Aferin. [Dolgu] - EEAA
Çok hoş mod_rewrite ve regex astarı. +1. - Steven Monday
Bunu bilmek bazen yararlıdır. RewriteCond aslında işleniyor sonra  RewriteRule Eşleşti. "RewriteCule'den önceki RewriteCule, bu tek kuralın koşullu duruma getirdiğini" söylediğin yerde "daha sonra bunun üzerinde daha fazla" demek isteyebilirsiniz. Düzenli ifadelerin Perl uyumlu düzenli ifadeler olduğunu belirtmek isteyebilirsiniz. Ayrıca, "... ... RewriteRule, dize başlangıcı ... ... düşünür." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 eşleşmiyor ilk dizin bileşeni - rewriterules varsayılan olarak açgözlüdür. /.*/(.*) her ikisi / 1 / (2) / ve / 1/2/3/4/5 / (6) / ile eşleşir, böylece / FIR / yolunu yalnızca eşleştirmek için / [^ /] * / bileşen. - adaptr
@ sysadmin1138, bu cevabın iyi olduğunu düşünüyorum, ancak bayraklar E, N, NS, P, PT ve S ile daha fazla detaylandırmanız daha iyi olabilir çünkü bu bayraklar nasıl işledikleri belli değildir. - Pacerier


Temel format nedir ve   mod_rewrite kurallarının yapısı?

Bu noktalarda sysadmin1138'in mükemmel yanıtını erteleyeceğim.

Düzenli form ve lezzet   ifadeler sağlam olmalı   avuçlamak?

Sözdizimi sırasına, sözdizimi eşleme / normal ifadelerine ve sysadmin1138 tarafından belirtilen RewriteRule işaretlerine ek olarak, mod_rewrite'nin Apache'nin HTTP istek başlıklarına ve Apache'nin yapılandırmasına dayalı ortam değişkenlerini gösterdiğine de dikkat çeker.

Ben tavsiye ederim AskApache's mod_rewrite Debug Eğitimi mod_rewrite için mevcut olabilecek kapsamlı bir değişken listesi için.

En yaygın olan ne   yeniden yazarken hatalar / tuzaklar   kurallar?

RewriteRule'un çoğu problemi, özel karakterlerden düzgün bir şekilde kaçmak için PCRE sözdizimi / başarısızlığının yanlış anlaşılmasından veya eşleştirmede kullanılan değişken (ler) in içeriğine dair bir içgörü bulunmamasından kaynaklanmaktadır.

Tipik sorunlar ve önerilen sorun giderme:

  • 500 - Dahili Sunucu Hatası - Windows taşıma denetimlerini kaldır Varsa yapılandırma dosyasında / dosyalarında, mod_rewrite öğesinin etkin olduğundan emin olun. IfModule Bu senaryoyu engellemek şartıyla), problemi tespit edilene kadar direktif sözdizimini kontrol edin, direktifleri yorumlayın
  • Yönlendirme döngüsü - Problem belirlene kadar RewriteLog ve RewriteLogLevel'den yararlanın, direktifleri yorumlayın

Test için iyi bir yöntem nedir ve   mod_rewrite kuralları doğrulanıyor mu?

Öncelikle, eşleşmeyi planladığınız ortam değişkenlerinin (içeriklerine) bakın. PHP yüklüyse, aşağıdaki bloğu uygulamanıza eklemek kadar basittir:

<?php
  var_dump($_SERVER);
?>

... daha sonra kurallarınızı yazın (tercihen bir geliştirme sunucusunda test yapmak için) ve Apache'nizdeki tutarsız eşleşmeyi veya aktiviteyi not edin. ErrorLog dosya.

Daha karmaşık kurallar için mod_rewrite’i kullanın RewriteLog etkinliğe bir dosyaya giriş ve yönlendirme yönergesi RewriteLogLevel 3

SEO veya performans var mı   mod_rewrite kurallarının anlamları I   Ya karşı dikkatli olunmalı?

AllowOverride all Apache'nin kontrol etmesi gerektiğinden sunucu performansını etkiler .htaccess Her istekte dosya ve ayrıştırma yönergeleri - mümkünse, siteniz için tüm yönergelerin VirtualHost yapılandırmasında kalmasını sağlayın veya etkinleştirin .htaccess sadece onlara ihtiyaç duyan dizinler için geçersiz kılınır.

Google'ın Web Yöneticisi Yönergeleri Açıkça şunu belirtin: "Kullanıcılarınızı aldatmayın veya arama motorlarına farklı içerikler sunun. Bunlar genellikle" gizleme "olarak adlandırılır. Bu, arama motoru robotlarını filtreleyen mod_rewrite yönergelerini oluşturmaktan kaçınır.

Arama motoru robotları 1: 1 içeriği tercih eder: URI eşlemesi (bu, içeriğe bağlantı sıralama için temel oluşturur) - geçici yeniden yönlendirmeler oluşturmak için mod_rewrite kullanıyorsanız veya birden fazla URI'nin altında aynı içeriği sunuyorsanız, kurallı URI HTML belgelerinizde.

Yaygın durumlar var mı   mod_rewrite doğru gibi görünebilir   iş için araç ama değil mi?

Bu, kendi başına büyük (ve potansiyel olarak tartışmalı) bir konudur - vaka bazında kullanımları ele almak için daha iyi (IMHO) ve isteklerin önerilen kararların kendi ihtiyaçları için uygun olup olmadığını belirlemesine izin verir.

Bazı yaygın örnekler nelerdir?

AskApache's mod_rewrite Hileler ve İpuçları Düzenli olarak ortaya çıkan tüm yaygın kullanım durumlarını kapsar, bununla birlikte, belirli bir kullanıcı için "doğru" çözüm, kullanıcının yapılandırmasının ve mevcut yönergelerin karmaşıklığına bağlı olabilir (bu nedenle, genel olarak iyi bir fikir olduğunu diğer Bir mod_rewrite sorusu geldiğinde, bir kullanıcının sahip olduğu direktifler).


38
2017-12-21 01:00



AskApache bağlantısı için teşekkürler. Aradığım şey bu! - sica07
AskApache palyaço, ASF tarafından resmen desteklenmiyor. Söylediği şeylerin çoğu tartışmalı veya düz yanlıştır. - adaptr
@adaptr Görünüşe göre farkında olduğunuz üstün kaynakları lütfen paylaşın. - danlefree
"mod_rewrite'in iş için doğru araç gibi göründüğü, ancak değil mi?" - basit mod_rewrite zaten kullanılmadığı yönlendirme. Mod_alias kullan Redirect veya RedirectMatch yerine. Ayrıca bkz. Apache dokümanları: Mod_rewrite kullanılmadığında - MrWhite


Birçok yönetici / geliştirici gibi, yıllardır yeniden yazma kurallarının inceliklerini tartışıyordum ve mevcut Apache dokümantasyonundan memnun kalmıyorum, bu yüzden kişisel bir proje olarak karar verdim. mod_rewrite Aslında Apache çekirdeğinin geri kalanıyla çalışıyor ve etkileşime giriyor, bu yüzden son birkaç ay içinde strace + tüm bunları ele almak için kaynak kodun içine sondaj.

Kural geliştiricilerinin dikkate alması gerekenleri yeniden yazmanız gereken bazı önemli yorumlar şunlardır:

  • Yeniden yazmanın bazı yönleri, sunucu yapılandırması, sanal ana bilgisayar, dizin, .htaccess işlemesi için yaygındır. ancak
  • PerDir'in aksine bazı işlemler kök yapılandırması (sunucu yapılandırması, sanal konak ve dizin) için çok farklıdır (.htaccess) işleme.
  • Daha da kötüsü, PerDir işlemenin neredeyse rasgele bir şekilde INTERNAL REDIRECT döngüsünü tetikleyebildiği için, root konfigürasyon öğelerinin böyle bir PerDir işleminin bunu tetikleyebileceğinin farkında olması gerekir.

Bunun nedeni olarak, neredeyse kullanıcı kullanıcı topluluklarını iki kategoriye ayırmanız ve bunları tamamen ayrı ele almanız gerektiğini söyleyeceğim.

  • Apache yapılandırmasına kök erişimi olanlar. Bunlar genellikle bir uygulama / sunucu / VM ile yönetici / geliştirici ve burada mesaj oldukça basittir: kullanmaktan kaçının .htaccess dosyalar mümkün ise; sunucunuzda veya vhost yapılandırmanızda her şeyi yapın. Geliştirici hata ayıklamayı ayarlayabildiğinden ve rewrite.log dosyalarına erişebildiğinden hata ayıklama oldukça kolaydır.

  • Paylaşılan bir barındırılan hizmetin kullanıcıları (SHS).

    • Bu kullanıcılar var kullanmak .htaccess / Perdir işlenemediği için alternatif mevcut değildir.
    • Daha da kötüsü, bu tür kullanıcıların yetenek seviyesi (mod_rewrite'nin regexp tabanlı merdiven-mantığını kullanabildiği sürece) genellikle deneyimli yöneticilerden önemli ölçüde daha azdır.
    • Apache ve barındırma sağlayıcıları hata ayıklama / tanılama desteği sunmaz. Tek tanılama bilgisi, başarılı bir yönlendirme, yanlış URI'ye yönlendirme. veya 404/500 durum kodu. Bu onları karışık ve çaresiz bırakır.
    • Apache, bu kullanım durumu için yeniden yazma işleminin nasıl çalıştığını açıklayan son derece zayıftır. Örneğin, PerDir'in net bir açıklamasını sağlamaz. .htaccessdosya seçildi ve neden. PerDir bisikletinin inceliklerini ve bundan nasıl kaçınılacağını açıklamıyor.

Muhtemelen üçüncü bir topluluk vardır: SHS sağlayıcılarının her iki kampta ayak izleyen ve yukarıdaki sonuçlara katlanmak zorunda kalan yönetici ve destek personeli.

Birkaç makale tarzı blog yazısı yazdım (ör. .Htaccess dosyalarında Rewrite kurallarını kullanma hakkında daha fazla bilgi) Bu yazıyı kısa tutmak için burada tekrarlamayacağım çok detaylı noktaları kapsar. Kendime ait ve VM FLOSS projelerini desteklemenin yanı sıra kendi paylaşımlı servisim var. SHS hesabım için bir test aracı olarak standart bir LAMP VM kullanarak başladım, ancak sonunda uygun bir ayna VM'si yapmanın daha iyi olduğunu buldum ( İşte).

Ancak, yönetici topluluğunun nasıl desteklemesi gerektiği konusunda .htaccess kullanıcılar, geliştirmek ve sunmak için ihtiyacımız olduğunu hissediyorum:

  • Yeniden yazma sisteminin PerDir işlemede nasıl çalıştığına dair tutarlı bir açıklama
  • Yazma konusunda bir dizi kural / en iyi uygulama .htaccess yeniden yazma kuralları
  • W3C html ayrıştırıcılarına benzeyen basit bir web tabanlı yeniden yazma komut dosyası ayrıştırıcısı, ancak kullanıcıların test URI'lerini girebildikleri veya aynı vektörleri test edebildikleri ve yeniden mantık akışının anlık kaydını alabileceği /
  • Yerleşik teşhisleri kurallarınızdan nasıl alacağınıza dair ipuçları (ör.

    • kullanım [E=VAR:EXPR] gerçeğini sömüren EXPR hedef betiğe tanılama olarak kullanılabilir hale getirmek için geri referansları ($ N veya% N) genişletecek.
    • Yeniden yazım kurallarınızın tümünü [OR], [C], [SKIP] ve [L] bayraklarını kullanarak düzenli olarak sipariş ederseniz, tüm yeniden yazma şeması çalışır olmadan dahili yeniden yönlendirmeden yararlanmanız gerektiğinde, tüm döngü sorunlarından kaçınmak için aşağıdakileri kural 1 olarak ekleyebilirsiniz:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

21
2018-01-14 16:50



Bu iyi belgelenmiştir. Neden belgelerin bunu açıklayamadığını söylüyorsunuz? - adaptr
Tek yapmanız gereken, .htaccess konular ve göreceksiniz. Yeni başlayanların çoğu umutsuzca karışır - bunların çoğu bir LAMP servisi ve paylaşılan bir hizmet üzerinde mod_rewrite ilk deneyimlerine sahiptir ve bu nedenle sistem / vhost yapılandırmalarına root erişimi yoktur ve dir işlemine göre kullanmak zorundadırlar. .htaccessDosyalar. Yeni başlayanın "kanamaması" gereken önemli farklılıklar var. Kendimi bir güç kullanıcısı olarak görüyorum ve hala incelikleri keşfediyorum. Dediğim gibi, bazı açılardan çalışmak için strace ve kaynak kodu taraması yapmak zorunda kaldım. Gerekmeyecek. :-( - TerryE
Tamamen katılıyorum. "Kullanıcı topluluklarını iki kategoriye ayırmalı ve bunları tamamen ayrı olarak ele almalıyız." Bazı kullanıcılar paylaşılan barındırma ve gerek güvenmek .htaccessuzmanlar için bile, çok kırılgan, karmaşık ve kafa karıştırıcı olan. Ben bir sorunum var. - Ryan


Rewritemap kullanarak

Rewritemaps ile yapabileceğiniz pek çok şey var. Rewritemaps, Rewritemap yönergesi kullanılarak bildirilir ve daha sonra hem RewritCond değerlendirmelerinde hem de RewriteRule Subsitutions'da kullanılabilir.

RewriteMap için genel sözdizimi şöyledir:

RewriteMap MapName MapType:MapSource

Örneğin:

RewriteMap examplemap txt:/path/to/file/map.txt

Daha sonra harita adını bu gibi yapılar için kullanabilirsiniz:

${examplemap:key}

Harita anahtar / değer çiftleri içerir. Anahtar bulunursa, değer belirtilir. Basit haritalar sadece düz metin dosyalarıdır, ancak karma haritaları ve hatta SQL sorgularını kullanabilirsiniz. Daha fazla ayrıntı dokümanlar:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

Unescaping dizeleri.

Bazı manipülasyonlar yapmak için kullanabileceğiniz dört dahili harita vardır. Özellikle unescaping dizeleri kullanışlı olabilir.

Örneğin: Sorgu dizesindeki "café" dizesini test etmek istiyorum. Ancak, tarayıcı sunucuma göndermeden önce bu durumdan kurtulacak, bu yüzden ya URL kaçtı sürümünün eşleştirmek istediğim her dize için ne olduğunu anlamaya ihtiyacım var, ya da sadece onu unescape ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

Sorgu dizesi parametresine yalnızca argümanı yakalamak için bir RewriteCond kullandığımı ve daha sonra haritayı yeniden görüntülemek için ikinci yeniden yazım sırasında nasıl kullanacağımı unutmayın. Bu daha sonra karşılaştırılır. Ayrıca,% 1'in "konum" veya "yer" i içereceği için, rewritemap'ta anahtar olarak% 2'ye nasıl ihtiyacımız olduğuna da dikkat edin. Kalıpları gruplandırmak için parantez kullandığınızda, yakalama sonucunu kullanmayı planlıyor olsanız da yakalanmayacaksınız.


15
2018-04-06 11:57



Son cümle doğru değil. mod_rewrite regexp motoru gibi yakalamayan grupları destekler (?:location|place) ve bu örnekte sadece bir yakalama olacaktır. - TerryE


En yaygın olan ne   yeniden yazarken hatalar / tuzaklar   kurallar?

Gerçekten kolay bir tuzak, görünen yolu değiştiren URL’leri yeniden yazmanızdır. itibaren /base/1234/index.html için /base/script.php?id=1234. Komut dosyasının bulunduğu göreli yollara sahip olan herhangi bir resim veya CSS, müşteri tarafından bulunmayacaktır. Bunu çözmek için bir dizi seçenek bulunabilir. bu sss.


12
2018-01-01 04:02



Bağlantı için teşekkürler. Özellikle yeniden yazma konusunda aşina olmayan diğer ekip üyeleriyle çalışırken, ek olarak <base> etiketi takip etmek en kolay olacak ve göreceli yolları etkinleştirmeye devam edecek. - kontur