Mod Rewrite yolu sorunları

5 Cevap php

Ben başarıyla gibi URL'leri işlemek için kuralları yeniden oluşturduk

http://example.com/xyz

http://example.com/xyz/

http://example.com/xyz/abc

http://example.com/xyz/abc/

Burada mod rewrite & olduğunu regex:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

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

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L]

Bu harika çalışıyor, ama sorun ben giderken http://example.com/xyz/abc, benim komut doğru girişi (n = abc) alır ama yolları gibi, yani benim kod tüm göreli URL'ler kırık, berbat olan şimdi yerine kök xyz göredir.

Tüm bu etrafında bir yolu var mı? Yukarıda gördüğünüz gibi ben doğru yolunu zorlamak için / index.php yönlendirmek için çalıştık. Beynim regex ve kod uzun bir gün sonra kızarmış, bu yüzden feci önemsiz bir şey değil umut var.

5 Cevap

Üç seçenek vardır:

1) (bu) böylece bağlantılar, resimler, scriptler, stil ve dahil olmak üzere, sayfada her göreli URI etkileyecek bir taban etiketi kullanın

<base href="http://yoursite/">

2) senin bağlantıların tam URI'larını için tüm değiştirme

<a href="http://yoursite/yourpage.html">

3) yolu, her URI köküne göreceli olduğunu göstermek için "/" öneki kullanın.

<a href="/yourpage.html">

Ben şahsen (gerçekten anlamadan onu kullanmış kişilerin) bazı kötü basın olsun demek baz etiketi seçeneği en kullandık. Bu mod_rewrite gelince muhtemelen tüm yolları tüm görüntüler, css, komut ve bağlantıları da dahil olmak üzere kök, göreli olarak İSTİYORUZ olarak, baz etiketi mükemmel.

Edit: I assume you are talking about URLs in your HTML code, e.g. to images and stylesheets, that are broken.

Tarayıcı bir yolu görür ve ona göre bilgi istekleri çünkü Hayır, bildiğim kadarıyla çevresinde hiçbir yolu yoktur. Bu sunucu ile ilgisi yoktur, ve yapabileceğiniz hiçbir şey yoktur.

Bir dizin splitter (örn. çizgi) olarak değil, farklı bir splitter başvurmak zorunda, ya da mutlak yolları kullanabilir veya <base> tag kullanacaktır ya. Ben baz ancak, kendimi etiketlemek hiç kullanmamış, ve her yerde bak çok iyi kabul edilmez. En iyi şey, muhtemelen mutlak yollara geçmek olacaktır.

yolunu içerecek şekilde son RewriteRule değiştirin. Eğer düzenli ifadede yolu var.

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ $1/index.php?n=$2 [L]

veya alternatif olarak (size ulaşmak için çalışıyoruz ne bağlı olarak):

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1/$2 [L]

Ben bir kısayol olarak benim sayfalarında BASE elemanı kullanılarak yerine tüm adresler değiştirerek denedim. Aşağıdaki gibi taban öğeyi ekleyin:

<base href="/">

Ve işte sonuçlar:

This:    <link type="text/css" rel="stylesheet" href="my.css">
Becomes: <link type="text/css" rel="stylesheet" href="/my.css">

This:    <script type="text/javascript" language="javascript" src="include/my.js"></script>
Becomes: <script type="text/javascript" language="javascript" src="/include/my.js"></script>

This:    <a href="foo.html">
Becomes: <a href="/foo.html">

This:    <a href="foo/bar.html">
Becomes: <a href="/foo/bar.html">

Her zaman baz etiketi gerekli kılabilirsiniz:

This:    <a href="/foo">
Remains: <a href="/foo">

This:    <a href="/foo/bar/">
Remains: <a href="/foo/bar/">