Bisakah saya menetapkan $ _SERVER ['REDIRECT_URL'] secara global sebelum eksekusi skrip?

8

Saya sedang dalam proses memigrasi banyak situs dari yang lama ke konfigurasi server baru. Setiap situs didasarkan pada basis kode yang sama (tapi sayangnya tidak identik), menggunakan mod_rewrite URL.

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

Sebagian besar berfungsi seperti pesona, tetapi pada konfigurasi baru $ _SERVER ['REDIRECT_URL'] tidak lagi disetel, dan kode gagal karena ketergantungan pada variabel global ini.

Dari apa yang saya mengerti, variabel ini diatur oleh Apache ketika terjadi redirect. Jelas ini tidak terjadi sekarang, tetapi saya berjuang untuk menemukan penyebabnya.

  • Apakah ini pembaruan Apache, atau (tebakan saya) beralih dari PHP FastCGI ke PHP5-FPM?
  • Bagaimana saya mendapatkan variabel ini kembali?

Saya benar-benar lebih suka tidak perlu mengedit kode di setiap situs, jadi saya akan mengatur auto_prepend PHP global jika perlu, tetapi idealnya saya ingin memperbaiki konfigurasi server dan mengatur ini di tempat pertama.

Terkait potensial: Saya sekarang juga memiliki beberapa variabel $ _SERVER baru, yaitu REDIRECT_SCRIPT_URL dan REDIRECT_REDIRECT_SCRIPT_URL. Ini tampaknya memiliki data yang benar yang saya inginkan untuk REDIRECT_URL, tetapi juga tampaknya menunjukkan ada dua pengalihan internal yang tidak terjadi sebelumnya - pencarian Google untuk REDIRECT_REDIRECT_SCRIPT_URL hanya mengembalikan output var_dump acak. Apakah SCRIPT_URL adalah REDIRECT_URL yang baru?

Edit 1

Memeriksa lagi REDIRECT_URL sudah (sekarang) diset, tetapi selalu ke 'index.php' (target mod_rewrite) alih-alih URL yang diketik yang diharapkan. Saya telah menggunakan PHP auto_prepend_file menggunakan untuk secara manual mengatur variabel yang diperlukan.

Saya tidak yakin bagaimana saya melewatkannya pada putaran pertama, tetapi saya telah membuat beberapa perubahan sementara itu jadi saya kira ada peluang di luar itu tidak ada. Permintaan maaf jika ini menyesatkan siapa pun.

Edit 2

Untuk mengatasi menyebutkan ErrorDocument di bawah ini, aturan mod_rewrite yang digunakan adalah:

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

Variabel $ _GET ['url'] diset, jadi aturannya harus berfungsi.

Untuk menjadi jelas, pada tahap ini saya telah pergi dengan solusi auto_prepend_file yang saya sebutkan pada awalnya.

Barry
sumber
-1 karena gagal menunjukkan uji tuntas. Pencarian Google cepat bukan pengganti untuk membaca dokumentasi. Sebelum meningkatkan sistem atau kode, Anda harus memastikan bahwa Anda memahami apa yang telah berubah, setidaknya sejauh itu memengaruhi sistem atau proyek Anda.
John Gardeniers
Permintaan maaf karena tidak jelas; Saya membaca dokumentasi sebaik mungkin. Kemudian saya beralih ke Google ketika saya menemukan sesuatu yang tidak bisa saya jelaskan. Konfigurasi ini pada mesin yang terpisah, dan selama pengujian pra-pindah saya telah menemukan masalah di atas. Namun, saya telah menemukan kesalahan yang saya buat, jadi saya akan memperbarui pertanyaan.
Barry
itu benar-benar dalam kepentingan Anda dan kami yang terbaik jika Anda memberi tahu kami hal-hal ini di depan. Saya telah membalikkan suara saya.
John Gardeniers
Bisakah Anda memberi kami informasi lebih lanjut tentang konfigurasi server sebelumnya dan yang baru? Pengaturan REDIRECT_URL dalam PHP berasal dari variabel lingkungan SCRIPT_URL di apache, saya rasa, tetapi ada banyak hal yang dapat memodifikasi perilaku impor itu (misalnya, suPHP, mesin pembungkus, pernyataan AddTypeHandler, dll).
Jon Kloske

Jawaban:

3

REDIRECT_URL ditetapkan hanya oleh server web Apache, dan hanya dalam keadaan tertentu . Ini mungkin bukan sesuatu yang harus diandalkan oleh kode Anda. Sejauh yang saya tahu, solusi terbaik adalah memperbaiki kode PHP buggy; Anda tidak dapat benar-benar memaksakan ini untuk selalu ditetapkan di Apache.

Michael Hampton
sumber
Terima kasih atas tanggapannya, meskipun saya tidak dapat melihat apa pun di tautan yang terkait dengan masalah saya. Saya tidak berpikir ErrorDocument eksternal terlibat dalam hal ini. Saya berharap saya bisa mengubah kode yang ada, tapi itu bukan opsi saat ini.
Barry
Intinya adalah, REDIRECT_URL hanya diatur selama pemrosesan ErrorDocument. Itu berarti skrip PHP Anda dimuat sebagai ErrorDocuments dalam konfigurasi asli, dan siapa pun yang menulisnya bergantung pada perilaku ini. Sekarang itu tidak terjadi, skrip rusak.
Michael Hampton
Tidak ada definisi ErrorDocument yang digunakan, dan saya tidak bisa melihat bagaimana mod_rewrite RewriteRule (ditambahkan di atas) melibatkan satu. Saya tidak setuju dengan Anda tentang REDIRECT_URL tidak dijamin, saya hanya tidak dapat menemukan dokumentasi yang relevan mengapa.
Barry
Saya menautkannya di atas dalam jawaban saya. Jika Anda memerlukan sesuatu lebih lanjut, Anda harus membaca kode sumber Apache. Bagaimanapun, ingatlah untuk menerima jawaban yang menyelesaikan masalah Anda dengan mengklik garis tanda centang di sebelahnya, dan selamat datang di Server Fault.
Michael Hampton
0

Menurut dokumentasi PHP:

$ _SERVER adalah array yang berisi informasi seperti header, path, dan lokasi skrip. Entri dalam array ini dibuat oleh server web. Tidak ada jaminan bahwa setiap server web akan menyediakan semua ini; server dapat menghilangkan beberapa, atau menyediakan yang lain tidak tercantum di sini. Yang mengatakan, sejumlah besar variabel-variabel ini dicatat dalam spesifikasi »CGI / 1.1 , sehingga Anda harus dapat mengharapkan mereka.

Jadi sepertinya tidak semua $_SERVERvariabel superglobal adalah platform-agnostik seperti yang diharapkan. $_SERVER['REQUEST_URI']tampaknya menjadi salah satu nilai yang secara konsisten ditentukan oleh semua webservers utama sehingga Anda mungkin ingin mencoba menggunakannya.

Garrett
sumber
Terima kasih untuk ini, tetapi saya sudah sadar bahwa kadang-kadang ini diatur, dan kadang tidak. Apa yang saya harapkan adalah cara untuk secara aktif memengaruhi variabel mana yang ditetapkan untuk konfigurasi khusus saya, karena saya tidak dapat menemukan dokumentasi pada spesifik berdasarkan pada konfigurasi saya (yaitu, bagaimana saya akan tahu sebelum membangun lingkungan).
Barry
0

Untuk gambar yang hilang di salah satu proyek kami yang mana diarahkan ke index.php saya baru saja menggunakan perbaikan ini:

url: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Jika Anda menginginkan solusi global, saya pikir Anda harus menggunakan explode () dll dan menggunakan Variabel lain yang diberikan seperti $ _SERVER ['REQUEST_URI'].

Perangkat Lunak Fusca
sumber
-1

Anda dapat mengatur file php otomatis-prepend untuk menyertakan potongan kecil kode PHP yang mengatur variabel ini.

Jon Kloske
sumber
Dalam pertanyaan saya, saya sudah mengidentifikasi ini sebagai tindakan yang akan saya ambil jika itu tidak mungkin. Itu juga yang akhirnya saya lakukan, sesuai hasil edit yang saya buat sebelum Anda menjawab.
Barry
Maaf, saya tidak ingat melihat hasil edit sebelum saya diposting; mungkin saya sudah mulai membalas sebelum Anda melakukan edit, tetapi saya tidak dapat memastikan karena edit berikutnya telah menghapus datestamp edit asli: / Saya juga seharusnya menjelaskan bahwa apa yang saya sarankan mungkin adalah cara yang tepat untuk capai apa yang Anda kejar, alih-alih "mundur". Anda dapat menggunakan flag [E: blah = blah] ke aturan penulisan ulang untuk mengatur variabel lingkungan yang berubah-ubah untuk kemudian mengambil di dalam file pra-sertakan yang lebih bersih daripada menggunakan variabel GET untuk mengirimkan barang dari mesin redirect ke kode Anda.
Jon Kloske
Dan dengan "mungkin benar", maksud saya itulah cara saya melakukan hal yang tepat ini di beberapa tempat di masa lalu.
Jon Kloske