Kesalahan "terlalu banyak pengalihan" berarti bahwa situs web terus dialihkan antara alamat yang berbeda dengan cara yang tidak akan pernah selesai. Seringkali ini adalah hasil dari pengalihan yang bersaing, yang satu mencoba memaksa HTTPS (SSL) dan yang lainnya mengarahkan kembali ke HTTP (non-SSL), atau antara bentuk URL www dan non-www.
Jika Anda menggunakan CMS seperti Wordpress, Magento, dll., yang menggunakan base_url atau konfigurasi jenis URL di dalam situs, Anda dapat berakhir dengan konfigurasi dalam kode atau database yang bertentangan dengan pengalihan dalam file .htaccess. Pengalihan yang bertentangan ini akan bolak-balik dan tidak pernah selesai.
Peramban Anda melindungi Anda dari ini dengan hanya mengizinkan sejumlah pengalihan (seringkali sepuluh atau lebih) sebelum menyerah dan melaporkan pesan kesalahan "terlalu banyak pengalihan." Ini muncul secara berbeda antara Chrome, Firefox, dan browser lainnya.
Firefox
Halaman tidak dialihkan dengan benar. Terjadi kesalahan selama koneksi ke
Chrome
Halaman ini tidak berfungsi
Bahkan utilitas pengujian curl menyerah setelah 50 pengalihan secara default.
Keriting: Pengalihan maksimum (X) diikuti
curl -svILk https://www.example.com
....
* Maximum (50) redirects followed
Langkah Pertama:Cache dan Cookie
Seperti yang ditunjukkan pada kesalahan browser di atas, pengalihan berulang ini juga dapat disebabkan oleh cookie di browser yang menyimpan pengalihan lama. Langkah pertama dalam pengujian adalah menghapus cache dan cookie di browser Anda. Jika Anda telah membersihkan cache dan cookie di browser, sekarang saatnya untuk beralih ke pemecahan masalah yang lebih lanjut.
Menggunakan Alat Pengembang untuk Pengulangan Pengalihan
Langkah selanjutnya dalam memecahkan masalah loop pengalihan semacam ini adalah dengan menggunakan Alat Pengembang di Firefox atau Chrome. Alat-alat ini biasanya dibuka dengan menekan tombol F12. Pastikan Anda memilih Jaringan tab di salah satu dari ini, lalu muat ulang halaman yang bermasalah.
Setelah memuat ulang halaman, Anda akan melihat rangkaian pengalihan terdaftar untuk Anda di jendela baru. Melihat pengalihan, Anda dapat melihat apakah mereka mengalihkan antara beberapa hal yang berbeda atau mengarahkan ke hal yang sama. Either way, Anda dapat melihat langkah-langkah yang mengarah ke kesalahan, bukan hanya kesalahan browser pengguna akhir.
Alat Pengembang di Firefox
Menggunakan cURL untuk Pengulangan Pengalihan
Sebagai bagian dari penulisan artikel ini, kami menyusun skrip Bash yang cukup sederhana yang dapat digunakan pada sistem mirip Unix dengan curl memerintah. Menggunakan curl itu bagus, karena tidak melakukan cache hal-hal dengan cara yang sama seperti browser, sehingga terkadang dapat memberi Anda perspektif yang berbeda saat memecahkan masalah.
Salin yang berikut ini ke editor teks pilihan Anda dan simpan sebagai redirects.sh .
#!/bin/bash
echo
for domain in $@; do
echo --------------------
echo $domain
echo --------------------
curl -sILk $domain | egrep 'HTTP|Loc' | sed 's/Loc/ -> Loc/g'
echo
done
Kemudian tandai redirects.sh file sebagai executable.
chmod +x redirects.sh
Anda dapat menjalankan skrip kami, seperti contoh di bawah, dengan menambahkan domain Anda setelah nama skrip. Ia bahkan dapat memeriksa beberapa domain dan akan memeriksa pengalihan setiap URL, pada gilirannya, menempatkan header di antara domain terpisah yang diuji.
Contoh Keluaran
./redirects.sh liquidweb.com
--------------------
liquidweb.com
--------------------
HTTP/1.1 301 Moved Permanently
-> Location: https://liquidweb.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.liquidweb.com/
HTTP/1.1 200 OK
Contoh Pengalihan Tak Terbatas dari HTTP ke HTTPS
./redirects.sh http://www.example.com
--------------------
http://www.example.com
--------------------
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
....
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
Catatan Tambahan tentang Jenis Pengalihan
Melihat ikal keluaran di atas Anda dapat melihat bahwa kode respons HTTP adalah 301. Pengalihan 301 adalah pengalihan "Permanen", artinya ada sesuatu yang telah dipindahkan secara permanen, dan Anda atau browser Anda harus mencarinya di lokasi baru baik sekarang maupun di masa mendatang. Pengalihan 302 adalah pengalihan "sementara" yang berarti bahwa sesuatu telah dipindahkan untuk saat ini, tetapi mungkin tidak selalu berada di lokasi baru.
301 redirect lebih sering ditulis sebagai redirect atau menulis ulang entri dalam file .htaccess. Pengalihan 302, bagaimanapun, baik dengan desain atau konvensi sering dihasilkan dalam kode situs web. Jadi aturan praktis yang baik adalah 301 dalam file .htaccess, dan 302 dalam kode situs. Ini mungkin tidak selalu benar, tetapi ini adalah hal yang baik untuk diingat.
Pengalihan di File .htaccess
File .htaccess adalah file konfigurasi yang digunakan untuk mengubah perilaku server Apache per direktori di situs web/server. Ini adalah file konfigurasi tingkat pengguna, dan hanya beberapa konfigurasi Apache yang dapat diedit di sini, meskipun pengalihan umum digunakan.
Anda dapat memiliki beberapa file .htaccess yang mengalir melalui serangkaian direktori. Jika Anda memiliki .htaccess di direktori induk, dan satu lagi di sub-direktori, keduanya akan memengaruhi sub-direktori. Dalam hal ini, penting untuk mengingat di mana Anda memiliki dan tidak memiliki file .htaccess, untuk mencegah konflik antara file .htaccess pada tingkat yang berbeda.
Di bawah ini adalah serangkaian contoh pengalihan dan akan membantu dalam mengidentifikasi pengalihan di file .htaccess Anda. Ini bukan satu-satunya cara untuk melakukan pengalihan semacam ini, tetapi ini akan menunjukkan kepada Anda seperti apa pengalihan yang paling umum sehingga Anda dapat mengenalinya jika mereka berada dalam file .htaccess yang sedang Anda kerjakan.
Paksa HTTPS
Kode .htaccess di bawah ini terlebih dahulu memeriksa apakah permintaan masuk ke server menggunakan HTTP atau HTTPS. Jika permintaan tidak menggunakan HTTPS, maka konfigurasi akan memberi tahu browser untuk mengalihkan ke versi HTTPS dari situs web dan URL yang sama yang diminta sebelumnya.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Paksa HTTPS:Saat Dibalik Load Balancer atau Proxy (CloudFlare/Incapsula/Sucuri/etc.)
Terkadang Anda mungkin menggunakan proxy, seperti penyeimbang beban atau firewall web, seperti CloudFlare, Incapsula, atau Sucuri. Ini dapat dikonfigurasi untuk menggunakan SSL di ujung depan, tetapi tidak menggunakan SSL di ujung belakang. Agar ini berfungsi dengan benar, Anda perlu memeriksa tidak hanya HTTPS dalam permintaan, tetapi juga apakah proxy meneruskan permintaan HTTPS asli ke server hanya dengan menggunakan HTTP. Aturan berikut ini memeriksa apakah permintaan diteruskan dari HTTPS, dan jika demikian, tidak mencoba mengalihkan waktu tambahan.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Paksa non-www
Pengalihan ini hanya memeriksa apakah nama situs web diminta dengan www di awal nama domain. Jika www disertakan, ia menulis ulang permintaan dan memberi tahu browser untuk mengalihkan ke versi non-www dari nama domain.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Paksa www
Pengalihan terakhir ini memeriksa apakah nama situs web tidak diminta dengan www di awal nama domain. Jika www tidak disertakan, ia akan menulis ulang permintaan dan memberi tahu browser untuk mengalihkan ke versi domain www.
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
WordPress
CMS WordPress menggunakan file .htaccess untuk menulis ulang URL ke index.php file, tetapi mendefinisikan URL situs web sebagai nilai dalam database. Jika Anda belum mengetahui nama database yang digunakan di situs, Anda dapat mencarinya di konfigurasi utama WordPress (wp-config.php ).
Anda juga dapat membuka file dalam editor teks dan mencari nilai-nilai ini, tetapi dari koneksi SSH, Anda dapat menggunakan program grep . Ini memberi Anda lebih dari sekadar nama database, tetapi nama database adalah yang paling penting untuk apa yang perlu kita lakukan selanjutnya.
grep DB wp-config.php
define('DB_NAME', 'wordpress_database');
define('DB_USER', 'wordpress_username');
define('DB_PASSWORD', 'Password');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
Tabel wp_options
Setelah Anda mengetahui nama database, Anda kemudian dapat melihat tabel opsi database Wordpress untuk melihat URL yang diatur dalam database. Tabel opsi dapat memiliki awalan apa pun di awal nama tabel, tetapi sering kali "wp_" secara default, jadi nama lengkap tabel opsi biasanya wp_options . Dua baris yang penting adalah rumah dan situs web baris dalam tabel pilihan. Anda dapat menemukannya menggunakan phpMyAdmin , atau utilitas manajemen database lainnya, tetapi dari baris perintah, Anda juga dapat menjalankan mysql berikut perintah.
mysql -e 'show tables' wordpress_database | grep options
prefix_options
Memeriksa URL yang Dikonfigurasi
Dari baris perintah, Anda dapat memeriksa apa nilai saat ini dari rumah dan situs web baris dalam tabel pilihan. Perintah akan mengirimkan Anda dan output seperti contoh di bawah ini. Bagian yang penting adalah bahwa ini cocok satu sama lain dalam sebagian besar keadaan dan bahwa mereka adalah apa yang Anda harapkan. Jika tidak seperti yang Anda harapkan, maka Anda perlu memperbaruinya.
mysql -e 'select * from wp_options where option_name rlike "home|siteurl"' wordpress_database
+-----------+-------------+----------------------------------+----------+
| option_id | option_name | option_value | autoload |
+-----------+-------------+----------------------------------+----------+
| 36 | home | http://www.example.com | yes |
| 1 | siteurl | http://www.example.com | yes |
+-----------+-------------+----------------------------------+----------+
Memperbarui URL yang Dikonfigurasi
Perintah berikut akan memperbarui dua baris wp_options tabel untuk database yang diberikan ke URL baru. Perintah ini harus sesuai dengan sebagian besar situasi di mana Anda perlu memperbarui atau memperbaiki URL yang dikonfigurasi untuk situs Wordpress. Memperbarui base_urls dikonfigurasi dalam Multisite Wordpress berada di luar cakupan artikel ini, tetapi akan melibatkan pembaruan beberapa wp_option ketik tabel.
mysql -e 'update wp_options set option_value="https://www.example.com" where option_name rlike "home|siteurl"' wordpress_database
Magento
Nama database Magento dikonfigurasi di salah satu file berikut, local.xml atau env.php . Anda juga dapat mengonfigurasi awalan untuk nama tabel database Magento, tetapi biasanya tidak disetel. Jadi nama yang diharapkan untuk tabel konfigurasi utama database hanya core_config_data .
# Version 1.x
app/etc/local.xml
# Version 2.x
app/etc/env.php
Tabel core_config_data
Ada banyak URL potensial yang dapat dikonfigurasi, tetapi semuanya memiliki "base_url " sebagai bagian dari baris dalam database. URL utama yang dikonfigurasi akan menjadi URL aman dan tidak aman, tetapi Anda juga dapat mengatur URL untuk gambar, file tema, atau bahkan mengatur URL terpisah untuk area administrasi situs. Anda dapat menemukannya lagi menggunakan utilitas manajemen basis data, tetapi dari baris perintah, Anda dapat menjalankan sesuatu seperti berikut ini.
mysql -e 'select * from core_config_data where path rlike "base_url"' magento_database
+-----------+---------+----------+-----------------------+----------------------------+
| config_id | scope | scope_id | path | value |
+-----------+---------+----------+-----------------------+----------------------------+
| 3 | default | 0 | web/unsecure/base_url | http://www.example.com |
| 4 | default | 0 | web/secure/base_url | http://www.example.com |
+-----------+---------+----------+-----------------------+----------------------------+
Untuk memperbarui base_urls di database Magento, Anda akan menjalankan sesuatu seperti perintah di bawah ini. Memperbarui base_url dari Multisite Magento juga di luar cakupan artikel ini, tetapi akan melibatkan referensi tambahan ke scope_id tertentu nilai untuk situs web atau toko tertentu yang dikonfigurasi dalam database Magento.
mysql -e 'update core_config_data set value="https://www.example.com" where path rlike "web/.*/base_url"' magento_database
Membungkus Semuanya
Dengan URL yang dikonfigurasi dalam database, seperti yang ditunjukkan di atas, perlu dicatat bahwa CMS ini juga menyediakan metode pengalihan sendiri di dalam kode situs. Jika, misalnya, Anda memiliki .htaccess redirect yang mengarahkan ke URL yang tidak selaras dengan apa yang ada di database, Anda bisa berakhir dengan infinite redirect loop seperti yang dijelaskan sebelumnya. Namun, Anda sekarang tahu seperti apa beberapa pengalihan .htaccess umum dan di mana menemukan URL yang dikonfigurasi di beberapa basis data perangkat lunak CMS. Anda juga diperlengkapi dengan baik untuk menguji, menyelidiki, dan mengonfirmasi apakah hal-hal ini bekerja bersama atau bertentangan satu sama lain, dan beberapa langkah untuk mengatasinya.