Kiat untuk debugging .htaccess aturan penulisan ulang

272

Banyak poster mengalami masalah debugging pernyataan RewriteRule dan RewriteCond mereka dalam .htaccessfile mereka . Sebagian besar menggunakan layanan hosting bersama dan karenanya tidak memiliki akses ke konfigurasi server root. Mereka tidak dapat menghindari menggunakan .htaccessfile untuk menulis ulang dan tidak dapat mengaktifkan RewriteLogLevel "seperti yang disarankan banyak responden. Juga ada banyak .htaccessjebakan dan kendala spesifik yang tidak tercakup dengan baik. Menyiapkan uji lokal LAMP stack melibatkan terlalu banyak kurva belajar untuk sebagian besar .

Jadi Q saya di sini adalah bagaimana kami menyarankan mereka men - debug aturan mereka sendiri . Saya memberikan beberapa saran di bawah ini. Saran lain akan dihargai.

  1. Memahami bahwa mesin mod_rewrite menggilir .htaccessfile . Mesin menjalankan loop ini:

    do
      execute server and vhost rewrites (in the Apache Virtual Host Config)
      find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled
      if found(.htaccess)
         execute .htaccess rewrites (in the user's directory)
    while rewrite occurred
    

    Jadi aturan Anda akan dieksekusi berulang kali dan jika Anda mengubah jalur URI maka mungkin akan mengeksekusi .htaccessfile lain jika ada. Jadi, pastikan Anda mengakhiri loop ini, jika perlu dengan menambahkan ekstra RewriteConduntuk menghentikan aturan menembak. Hapus juga .htaccessaturan penulisan ulang tingkat bawah kecuali secara eksplisit bermaksud menggunakan aturan multi-level.

  2. Pastikan bahwa sintaksis masing-masing Regexp benar dengan menguji terhadap serangkaian pola pengujian untuk memastikan bahwa itu adalah sintaks yang valid dan melakukan apa yang Anda inginkan dengan serangkaian URI pengujian lengkap. Lihat jawaban di bawah untuk detail lebih lanjut.

  3. Buat aturan Anda secara bertahap di direktori tes. Anda dapat menggunakan "jalankan .htaccessfile terdalam pada fitur path" untuk membuat direktori tes (pohon) terpisah dan men-debug aturan di sini tanpa mengacaukan aturan utama Anda dan menghentikan kerja situs Anda. Anda harus menambahkannya satu per satu karena ini adalah satu-satunya cara untuk melokalisasi kegagalan pada aturan individual.

  4. Gunakan rintisan skrip dummy untuk membuang variabel server dan lingkungan . (Lihat Listing 2 ) Jika aplikasi Anda menggunakan, katakanlah, blog/index.phpmaka Anda dapat menyalin ini test/blog/index.phpdan menggunakannya untuk menguji aturan blog Anda di testsubdirektori. Anda juga dapat menggunakan variabel lingkungan untuk memastikan bahwa mesin penulisan ulang dalam menafsirkan string substitusi dengan benar, misalnya

    RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
    

    dan cari variabel REDIRECT_ * ini di dump phpinfo. BTW, saya menggunakan yang ini dan menemukan di situs saya bahwa saya harus menggunakan %{ENV:DOCUMENT_ROOT_REAL}sebagai gantinya. Dalam kasus redirector looping, REDIRECT_REDIRECT_ * variabel mendaftar pass sebelumnya. Dll ..

  5. Pastikan bahwa Anda tidak digigit oleh caching browser yang salah 301 redirect . Lihat jawaban di bawah ini . Terima kasih kepada Ulrich Palha untuk ini.

  6. Mesin penulisan ulang tampaknya sensitif terhadap aturan bertingkat dalam .htaccesskonteks, (di situlah RewriteRulehasil substitusi dan ini jatuh ke aturan lebih lanjut), karena saya menemukan bug dengan sub-permintaan internal (1) , dan pemrosesan PATH_INFO yang salah yang sering kali dapat dicegah dengan menggunakan bendera [NS], [L] dan [PT].

Ada komentar atau saran lagi?

Listing 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);
TerryE
sumber
10
Ini bagus ... Mungkin Anda harus memindahkannya dari pertanyaan menjadi jawaban.
w00t
@ w00t, saya telah memisahkan regexp checker sesuai saran Anda karena saya ingin merujuknya dengan tautan di jawaban lain.
TerryE
3
Anda mungkin ingin menambahkan diagram alir kontrol dari dokumen ke saran pertama Anda. IMO jauh lebih mudah untuk dipahami daripada kodesemu atau penjelasan, dan ini benar-benar bagian paling gelap dari voodoo mod-rewrite.
SáT
Nomor 6 adalah masalah besar. Aturan penulisan ulang berperilaku berbeda dalam file konfigurasi apache standar vs dalam file .htaccess harus menangkap banyak orang.
Iain Collins
Sesuatu yang mungkin layak ditambahkan ke petunjuk ini: Saya menghabiskan waktu men-debug masalah dengan itu mengarahkan dan tidak menulis ulang. Ternyata saya sudah menulis ulang ke "/ komentar" ketika saya ingin "/ komentar /". Itu menulis ulang ke "/ komentar" dan kemudian server melakukan redirect ke "/ komentar /". Perilaku yang jelas untuk yang digunakan untuk Apache tetapi mungkin kurang begitu untuk pemula seperti saya.
Chris

Jawaban:

132

Berikut adalah beberapa tips tambahan tentang aturan pengujian yang dapat memudahkan debugging untuk pengguna di hosting bersama

1. Gunakan agen pengguna palsu

Saat menguji aturan baru, tambahkan syarat untuk hanya menjalankannya dengan fakeagen-pengguna yang akan Anda gunakan untuk permintaan Anda. Dengan cara ini tidak akan memengaruhi orang lain di situs Anda.

misalnya

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

Jika Anda menggunakan Firefox, Anda dapat menggunakan User Agent Switcher untuk membuat string dan pengujian agen pengguna palsu.

2. Jangan gunakan 301 sampai Anda selesai menguji

Saya telah melihat begitu banyak posting di mana orang masih menguji aturan mereka dan mereka menggunakan 301. JANGAN .

Jika Anda tidak menggunakan saran 1 di situs Anda, tidak hanya Anda, tetapi siapa pun yang mengunjungi situs Anda pada saat itu akan terpengaruh oleh 301.

Ingatlah bahwa mereka permanen, dan di-cache secara agresif oleh browser Anda. Gunakan 302 bukan sampai Anda yakin, lalu ubah ke 301.

3. Ingat bahwa 301's secara agresif di-cache di browser Anda

Jika aturan Anda tidak berfungsi dan tampaknya tepat untuk Anda, dan Anda tidak menggunakan saran 1 dan 2, maka tes ulang setelah membersihkan cache browser Anda atau saat browsing pribadi.

4. Gunakan alat Pengambilan HTTP

Gunakan alat penangkapan HTTP seperti Fiddler untuk melihat lalu lintas HTTP aktual antara browser Anda dan server.

Sementara orang lain mungkin mengatakan itu milik Anda site does not look right, Anda bisa melihat dan melaporkannya all of the images, css and js are returning 404 errors, dengan cepat mempersempit masalahnya.

Sementara orang lain akan melaporkan bahwa Anda started at URL A and ended at URL C, Anda dapat melihat bahwa mereka mulai URL A, were 302 redirected to URL B and 301 redirected to URL C. Bahkan jika URL C adalah tujuan akhir, Anda akan tahu bahwa ini buruk untuk SEO dan perlu diperbaiki.

Anda akan dapat melihat header cache yang ditetapkan di sisi server, memutar ulang permintaan, memodifikasi header permintaan untuk menguji ....


Ulrich Palha
sumber
9
Ulrich, terima kasih banyak atas masukan ini. Anda telah mengambil beberapa aspek yang saya tidak ingin masukkan ke dalam daftar saya. Pada masalah debugging 301, saya menggunakan Chrome di "Penjelajahan Pribadi" (AKA "mode Porno") karena ini menumpahkan info keadaan ini ketika Anda menutup jendela. Saya harap Anda tidak keberatan saya tidak "menerima" ini sebagai poin penting, tetapi bukan jawaban terbaik. Terima kasih lagi. :)
TerryE
1
Untuk membuatnya jelas (Anda memang memilikinya dalam kode Anda tetapi tidak menemukannya) tetapi untuk memastikan Anda menggunakan pengalihan 302 bukan 301 yang Anda butuhkan[L,R=302]
icc97
6
Anda tidak perlu secara eksplisit menentukan [L, R=302]apakah [L,R]defaultnya302
Rahil Wazir
2
@goodeye, lihat juga "Chrome> Pengaturan> Umum> Nonaktifkan Cache saat DevTools terbuka".
johnsnails
83

Pengujian penulisan ulang .htaccess online

Saya menemukan ini Googling untuk regex bantuan, itu menyelamatkan saya banyak waktu dari keharusan untuk meng-upload baru .htaccessfile setiap kali saya melakukan sedikit modifikasi.

dari situs:

htaccess tester

Untuk menguji aturan penulisan ulang htaccess Anda, cukup isi url yang Anda terapkan aturannya, letakkan konten htaccess Anda di area input yang lebih besar dan tekan tombol "Periksa Sekarang".

JCastell
sumber
6
Terima kasih atas penunjuk ke alat ini, yang saya temukan cara paling langsung untuk men-debug masalah saya.
BobHy
Jika Anda memiliki akses ssh ke ruang web Anda, opsi lain adalah mengubah .htaccess secara langsung melalui editor di server.
sjas
Anda harus mengabaikan peringatan ssl b / c sertifikat situs mengalami masalah. Namun situs itu masih ada. Ini adalah solusi terbaik dan termudah. Ini memberi wawasan luar biasa tentang apa yang salah dan menghasilkan perbaikan masalah CEPAT.
toddmo
Terima kasih telah menunjukkan alat ini. Ini membantu, Kadang-kadang men-debug apt htaccess itu sendiri sangat sulit. Terima kasih. Terima Kasih Besar
Benyamin Limanto
Tampaknya tautan yang direferensikan bermasalah dan tidak selalu memberikan Anda hasil yang tepat. Silakan periksa apache yang sebenarnya untuk benar-benar yakin.
Parth
13

Jangan lupa bahwa dalam file .htaccess itu adalah URL relatif yang cocok.

Dalam file .htaccess, RewriteRule berikut tidak akan pernah cocok:

RewriteRule ^/(.*)     /something/$s
Krist van Besien
sumber
4
Ya string yang dimasukkan ke dalam Aturan Menulis Ulang itu relatif dan karena itu ditelanjangi pada setiap pemimpin /, tetapi pengupasan ini tidak terjadi untuk string yang cocok yang dirangkai dalam perintah Rewrite Cond .
TerryE
8

Pastikan bahwa sintaks dari setiap Regexp sudah benar

dengan menguji terhadap serangkaian pola pengujian untuk memastikan bahwa itu adalah sintaks yang valid dan melakukan apa yang Anda inginkan dengan serangkaian URI pengujian lengkap.

Lihat regexpCheck.php di bawah ini untuk skrip sederhana yang dapat Anda tambahkan ke direktori pribadi / tes di situs Anda untuk membantu Anda melakukan ini. Saya menyimpan ini singkat daripada cantik. Cukup lewati ini ke file regexpCheck.phpdi direktori tes untuk menggunakannya di situs web Anda. Ini akan membantu Anda membangun regexp dan mengujinya terhadap daftar kasus uji saat Anda melakukannya. Saya menggunakan mesin PHP PCRE di sini, tetapi setelah melihat sumber Apache, ini pada dasarnya identik dengan yang digunakan di Apache. Ada banyak HowTos dan tutorial yang menyediakan template dan dapat membantu Anda membangun keterampilan regexp Anda.

Listing 1 - regexpCheck.php

<html><head><title>Regexp checker</title></head><body>
<?php 
    $a_pattern= isset($_POST['pattern']) ? $_POST['pattern'] : "";
    $a_ntests = isset($_POST['ntests']) ? $_POST['ntests'] : 1;
    $a_test   = isset($_POST['test']) ? $_POST['test'] : array();
    
    $res = array(); $maxM=-1; 
    foreach($a_test as $t ){
        $rtn = @preg_match('#'.$a_pattern.'#',$t,$m);
        if($rtn == 1){
            $maxM=max($maxM,count($m));
            $res[]=array_merge( array('matched'),  $m );
        } else {
            $res[]=array(($rtn === FALSE ? 'invalid' : 'non-matched'));
        }
    } 
?> <p>&nbsp; </p>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
    <label for="pl">Regexp Pattern: </label>
    <input id="p" name="pattern" size="50" value="<?php echo htmlentities($a_pattern,ENT_QUOTES,"UTF-8");;?>" />
    <label for="n">&nbsp; &nbsp; Number of test vectors: </label>
    <input id="n" name="ntests"  size="3" value="<?php echo $a_ntests;?>"/>
    <input type="submit" name="go" value="OK"/><hr/><p>&nbsp;</p>
    <table><thead><tr><td><b>Test Vector</b></td><td>&nbsp; &nbsp; <b>Result</b></td>
<?php 
    for ( $i=0; $i<$maxM; $i++ ) echo "<td>&nbsp; &nbsp; <b>\$$i</b></td>";
    echo "</tr><tbody>\n";
    for( $i=0; $i<$a_ntests; $i++ ){
        echo '<tr><td>&nbsp;<input name="test[]" value="', 
            htmlentities($a_test[$i], ENT_QUOTES,"UTF-8"),'" /></td>';
        foreach ($res[$i] as $v) { echo '<td>&nbsp; &nbsp; ',htmlentities($v, ENT_QUOTES,"UTF-8"),'&nbsp; &nbsp; </td>';}
        echo "</tr>\n";
    }
?> </table></form></body></html>
TerryE
sumber
1
Catatan Cepat: import_request_variablessudah tidak digunakan lagi di PHP 5.3 dan dihapus di 5.4. extract($_GET)ditambah dengan extract($_POST)dapat melakukan fungsi yang sama, tetapi semua variabel akan memerlukan awalan dihapus dari namanya. Sumber: php.net/manual/en/function.import-request-variables.php
Jeff Lambert
@watcher, terima kasih. Saya telah memperbarui versi lokal saya menjadi 5,4 kompatibel setahun yang lalu, tetapi lupa mengubah posting ini. Sekarang sudah selesai.
TerryE
oh my, bahkan setelah diedit, tidak bisa mendapatkan hasil yang baik hanya dengan menyalin kode Anda ... tetapi dengan biola regex sekitar, saya rasa alat Anda sudah usang bagaimanapun. lihat alat keren ini: regex101.com atau refiddle.com atau regexr.com
perangkat lunak hexerei
@hexereisoftware, postingan ini berumur 3 tahun, jadi mungkin ada masalah yang tidak kentara tergantung pada versi PHP yang sekarang digunakan dan versi Apache. Namun ada banyak varian regexp masing-masing dengan perbedaan yang halus. Seperti yang saya katakan kode Apache menggunakan mesin PCRE yang sangat mirip dengan mesin PHP. Saya tidak yakin apa bedanya dengan varian lain seperti. Net, jadi sementara saran Anda untuk menggunakan sumber daya online adalah yang baik, saya akan tetap dengan yang secara eksplisit mendukung apache atau sintaks PHP. :-)
TerryE
Perl akan paling dekat, tetapi php menggunakan sintaksis yang sama
perangkat lunak hexerei
7

Pastikan Anda menggunakan tanda persen di depan variabel, bukan tanda dolar.

Ini %{HTTP_HOST}, tidak ${HTTP_HOST} . Tidak akan ada apa-apa di error_log, tidak akan ada Kesalahan Server Internal, regexp Anda masih benar, aturannya tidak akan cocok. Ini benar-benar mengerikan jika Anda sering bekerja dengan django / genshi templates dan miliki ${}untuk substitusi variabel dalam memori otot.

Simon
sumber
1
Ya, variabel substitusi $ terkait dengan pola RewriteRule terakhir dan % yang terkait dengan pola RewriteCond terakhir dan spesial seperti% {env: XXX}
TerryE
7

Satu dari beberapa jam yang saya buang:

Jika Anda telah menerapkan semua tips ini dan hanya terjadi 500 kesalahan karena Anda tidak memiliki akses ke log kesalahan server, mungkin masalahnya bukan di .htaccess tetapi dalam file yang dialihkan ke.

Setelah saya memperbaiki masalah .htaccess saya, saya menghabiskan dua jam lagi mencoba memperbaikinya lagi, meskipun saya hanya lupa tentang beberapa izin.

Ruben
sumber
Saya menggunakan layanan hosting hosting akses bersama untuk situs pribadi saya, tetapi yang saya lakukan adalah membuat VM uji yang kira-kira mencerminkan hal ini dalam hal konfigurasi PHP / Apache, direktori home, dll. Namun karena VM ini di bawah saya admin Saya dapat mengaktifkan penulisan ulang logging untuk mendiagnosis .htaccessmasalah yang sulit .
TerryE
6

Setel variabel lingkungan dan gunakan tajuk untuk menerimanya:

Anda dapat membuat variabel lingkungan baru dengan baris RewriteRule, seperti yang disebutkan oleh OP:

RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]

Tetapi jika Anda tidak bisa membuat skrip sisi server berfungsi, bagaimana Anda bisa membaca variabel lingkungan ini? Salah satu solusinya adalah mengatur tajuk:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

Nilai menerima penentu format , termasuk %{NAME}epenentu untuk variabel lingkungan (jangan lupa huruf kecil e). Kadang-kadang, Anda perlu menambahkan REDIRECT_awalan, tetapi saya belum berhasil ketika awalan itu ditambahkan dan ketika tidak.

Flimm
sumber
Sudahkah Anda memperoleh wawasan lebih lanjut tentang kapan harus menggunakan atau tidak menggunakan REDIRECT_awalan? Juga, saya melihat terminologi tentang awalan dalam konteks (htaccess) lain juga, tetapi tidak pernah jelas apa yang dimaksud. Apakah itu berarti bahwa Anda harus memberi nama variabel Anda dengan awalan, atau menambahkan awalan ke variabel bernama Anda, ketika menggunakan perintah tertentu (tetapi tidak perintah lain)? Misalnya Anda adalah pertama yang menunjukkan kedua definisi var, dan penggunaan var, jadi dari ini saya cenderung berpikir yang terakhir! Dokumennya sedikit membantu - mereka menganggap kita tahu terlalu banyak, dan memberikan terlalu sedikit referensi / tautan.
SherylHohman
5

Jika Anda membuat pengalihan, uji dengan curl untuk menghindari masalah caching browser. Gunakan -I untuk mengambil header http saja. Gunakan -L untuk mengikuti semua pengalihan.

flm
sumber
3

Saya menemukan pertanyaan ini ketika mencoba men-debug masalah mod_rewrite saya, dan itu pasti memiliki beberapa saran yang bermanfaat. Tetapi pada akhirnya yang paling penting adalah memastikan Anda memiliki sintaks regex Anda yang benar. Karena masalah dengan sintaks RE saya sendiri, menginstal skrip regexpCheck.php bukan pilihan yang layak.

Tetapi karena Apache menggunakan Perl-Compatible Regular Expressions (PCRE), alat apa pun yang membantu penulisan PCRE akan membantu. Saya telah menggunakan alat RegexPlanet dengan Java dan Javascript REs di masa lalu, dan senang menemukan bahwa mereka mendukung Perl juga.

Cukup ketik ekspresi reguler Anda dan satu atau lebih URL contoh, dan itu akan memberi tahu Anda jika regex cocok (a "1" di kolom "~ =") dan jika ada, setiap grup yang cocok (angka dalam "split" kolom akan sesuai dengan angka yang diharapkan Apache, mis. $ 1, $ 2 dll.) untuk setiap URL. Mereka mengklaim dukungan PCRE "dalam versi beta", tetapi hanya itu yang saya butuhkan untuk menyelesaikan masalah sintaksis saya.

http://www.regexplanet.com/advanced/perl/index.html

Saya hanya akan menambahkan komentar ke jawaban yang ada tetapi reputasi saya belum pada tingkat itu. Semoga ini bisa membantu seseorang.

Lambart
sumber
alat yang bagus, tetapi formulir yang mengerikan ... lihat alat keren ini: regex101.com atau refiddle.com atau regexr.com
perangkat lunak hexerei
3

Mengenai 4., Anda masih perlu memastikan bahwa "rintisan naskah boneka" Anda sebenarnya adalah URL target setelah semua penulisan ulang dilakukan, atau Anda tidak akan melihat apa pun!

Trik serupa / terkait (lihat pertanyaan ini ) adalah memasukkan aturan sementara seperti:

RewriteRule (.*) /show.php?url=$1 [END]

Di mana show.phpada beberapa skrip yang sangat sederhana yang hanya menampilkan $_GETparameternya (Anda dapat menampilkan variabel lingkungan juga, jika Anda mau).

Ini akan menghentikan penulisan ulang pada saat Anda memasukkannya ke dalam ruleset, lebih seperti breakpoint di debugger.

Jika Anda menggunakan Apache <2.3.9, Anda harus menggunakan [L]daripada [END], dan Anda mungkin perlu menambahkan:

RewriteRule ^show.php$ - [L]

Di bagian paling atas dari aturan Anda, jika URL /show.phpitu sendiri sedang ditulis ulang.

Lakukan
sumber
3

Beberapa kesalahan yang saya amati terjadi ketika menulis .htaccess

Penggunaan ^(.*)$berulang dalam beberapa aturan, menggunakan ^(.*)$menyebabkan aturan lain menjadi impoten dalam kebanyakan kasus, karena cocok dengan semua url dalam satu hit.

Jadi, jika kita menggunakan aturan untuk url ini, sapmle/urlia juga akan mengkonsumsi url ini sapmle/url/string.


[L] bendera harus digunakan untuk memastikan aturan kami telah melakukan pemrosesan.


Harus tahu tentang:

Perbedaan dalam% n dan $ n

%ndicocokkan selama %{RewriteCond}bagian dan dicocokkan $npada %{RewriteRule}bagian.

Bekerja dari RewriteBase

Arahan RewriteBase menentukan awalan URL yang akan digunakan untuk arahan per-direktori (htaccess) RewriteRule yang menggantikan jalur relatif.

Arahan ini diperlukan ketika Anda menggunakan jalur relatif dalam substitusi dalam konteks per-direktori (htaccess) kecuali salah satu dari kondisi berikut ini benar:

Permintaan asli, dan substitusi, berada di bawah DocumentRoot (sebagai lawan dapat dijangkau dengan cara lain, seperti Alias). Jalur sistem file ke direktori yang berisi RewriteRule, yang diakhiri dengan substitusi relatif juga valid sebagai jalur URL di server (ini jarang terjadi). Di Apache HTTP Server 2.4.16 dan yang lebih baru, arahan ini dapat dihilangkan ketika permintaan dipetakan melalui Alias ​​atau mod_userdir.

Abhishek Gurjar
sumber
2

Jika Anda berencana untuk menulis lebih dari satu baris aturan dalam
.

Saya sudah membuang-buang waktu menetapkan banyak aturan, tanpa umpan balik dari LOG, hanya untuk akhirnya menyerah.
Saya mendapatkan Apache di PC saya, menyalin seluruh situs ke HDD-nya, dan mengatur seluruh aturan, menggunakan log, sangat cepat.
Kemudian saya meninjau aturan lama saya, yang berfungsi. Saya melihat mereka tidak benar-benar melakukan apa yang diinginkan. Bom waktu, diberi alamat yang sedikit berbeda.

Ada begitu banyak lubang jatuh dalam aturan penulisan ulang, itu bukan hal yang logis sama sekali.
Anda dapat mengaktifkan dan menjalankan Apache dalam sepuluh menit, ini 10MB, lisensi yang bagus, * NIX / WIN / MAC siap, bahkan tanpa menginstal.
Juga, periksa baris tajuk server Anda dan dapatkan versi Apache yang sama dari arsip mereka jika sudah lama. OP saya masih di 2.0; banyak hal yang tidak didukung.

papo
sumber
papo, saya sudah menjalankan server khusus, VPS yang dihosting ISP dan VM pribadi dalam struktur pengembangan saya, tetapi saya masih menggunakan layanan hosting bersama untuk domain publik dan email saya, hanya karena lebih nyaman dan hemat biaya untuk menggunakan sepenuhnya dikelola layanan untuk ini. Howto ini benar-benar ditargetkan untuk pengguna layanan bersama. Mengkonfigurasi VM pribadi untuk mencerminkan layanan bersama sepenuhnya sulit. Ya, jika Anda dapat menggunakan tes VM membantu, tapi saya masih menggunakan "trik" ini dari waktu ke waktu pada layanan bersama saya.
TerryE
1
Saya setuju dengan ini jika A Anda telah dibingkai sebagai saran alternatif untuk mod_rewriteaturan debugging , tetapi pembukaan "bahkan tidak memikirkannya" hanyalah saran yang buruk untuk pengguna layanan dasar bersama yang berjuang untuk memahami mengapa htaccessfile mereka tidak ada . t bekerja dengan cara yang mereka inginkan.
TerryE
Saya minta maaf jika kedengarannya seperti pekerjaan Anda mengumpulkan koleksi nasihat yang bagus tidak ada artinya. Saya tidak menginginkan itu. Percayalah, saya sangat senang membaca dan mengikuti banyak saran yang ditawarkan utas ini. Tetapi peraturan saya perlahan menjadi rumit dan pada akhirnya, saya membuang banyak waktu dengan tidak ingin melalui masalah menginstal server Apache dan melakukan debugging seperti yang seharusnya dilakukan. Lebih dari itu, saya tidak belajar apa-apa, karena saya tidak melihat, dalam log, apa yang sebenarnya terjadi. Dan ada banyak hal yang terjadi. Saya percaya berbagi pengalaman ini juga berharga.
papo
untuk bagian kedua, ada IF. Teks saya tidak pernah dimulai dengan 'jangan pikirkan' Saya mengerti sekarang, kata-kata ini agak kasar tetapi itu semua benar. Terutama bagi mereka yang baru dengan ini dan berjuang untuk memahami. Memberi saran di sini mungkin menyesatkan mereka, seperti saya, bahwa yang saya butuhkan adalah regex yang solid, itu tidak begitu sederhana, seperti poin Anda 6) PATH_INFO membuat saya banyak masalah dan itu bukan bug seperti yang Anda katakan, tetapi fitur. Jika Anda tidak ingin itu ditambahkan kembali, gunakan [DPI]. Tetapi hanya jika Anda akan melihat log, Anda akan melihatnya ditambahkan di sana. Itu sebabnya, lebih dari satu baris, dan Anda lebih baik menggunakan log
papo
1
Maaf @papo, tapi alasan saya untuk suara -1 adalah saya pikir ini "bahkan tidak memikirkannya" adalah saran yang buruk, IMO. Jika maksud Anda adalah "di atas kompleksitas tertentu, maka Anda mungkin lebih mudah untuk menginstal layanan Apache lokal untuk men-debug .htaccessfile Anda " maka ini lebih seimbang. Ya, cukup mudah untuk mengatur layanan Apache lokal, tetapi membuatnya mencerminkan layanan hosting bersama penyedia layanan bisa rumit, dan di luar tingkat keterampilan banyak pengguna yang mungkin baru saja menggunakan pengaturan satu-klik Wordpress, katakan, dan memiliki masalah dengan .htaccessfile mereka .
TerryE
1

Saya akan meninggalkan ini di sini, mungkin detail yang jelas, tetapi membuat saya membenturkan kepalaku selama berjam-jam: hati-hati menggunakan %{REQUEST_URI}karena apa yang dikatakan @Krist van Besien dalam jawabannya benar-benar benar, tetapi tidak untuk string REQUEST_URI , karena kehabisan ini TestString dimulai dengan a /. Jadi berhati-hatilah:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing
Gruber
sumber
0

(Mirip dengan ide Doin) Untuk menunjukkan apa yang cocok, saya menggunakan kode ini

$keys = array_keys($_GET);
foreach($keys as $i=>$key){
    echo "$i => $key <br>";
}

Simpan ke r.php di root server dan kemudian lakukan beberapa tes di .htaccess
Misalnya, saya ingin mencocokkan url yang tidak dimulai dengan awalan bahasa

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit
UnLoCo
sumber
1
hanya menggunakan rintisan phpinfo () seperti yang saya sebutkan pada poin 4 pada O / P saya pada dasarnya melakukan hal yang sama. CarilahQUERY_STRING
TerryE
0

seperti yang ditunjukkan oleh @JCastell, tester online melakukan pekerjaan yang baik untuk menguji pengalihan individu terhadap file .htaccess. Namun, yang lebih menarik adalah api yang terpapar yang dapat digunakan untuk menguji batch daftar url menggunakan objek json. Namun, untuk membuatnya lebih berguna, saya telah menulis file skrip bash kecil yang menggunakan curl dan jq untuk mengirimkan daftar url dan mem-parsing respon json ke dalam output form CSV dengan nomor baris dan aturan yang cocok dengan file htaccess bersama dengan url yang dialihkan, sehingga cukup mudah untuk membandingkan daftar url dalam spreadsheet dan dengan cepat menentukan aturan mana yang tidak berfungsi.

Aurovrata
sumber
-1

Jika Anda bekerja dengan url, Anda mungkin ingin memeriksa apakah "Enable Mod Rewrite"

Aransiola Oluwaseun
sumber