URL aset mana yang dapat diterima di instalasi vanilla vanilla?

9

Wordpress tampaknya membiarkan konten ditangani oleh banyak URI dalam instalasi MU. Sebagai contoh:

 example.com/wp-content/blogs.dir/5/files/picture.jpg
 example.com/bob/files/picture.jpg
 example.com/bob/wp-content/blogs.dir/5/files/pictures.jpg

Semua tampak merutekan ke tempat yang sama. Apakah ada lebih banyak alias? Yang mana adalah kanonik? Apakah ada yang tidak disengaja ini? Apakah ada filter yang relevan?

wowest
sumber

Jawaban:

4

Jawaban singkat

example.com/bob/files/picture.jpg adalah URL kanonik yang disukai untuk gambar dalam instalasi WordPress Multisite . Dua URL dengan blogs.dirURL pada dasarnya identik, dan keduanya memanfaatkan struktur sistem file. Path dengan 'bob' ada karena Anda melakukan instalasi sub-direktori, bukan instalasi subdomain. Jalur lain akan ada berdasarkan situs Anda yang lain, misalnya example.com/fred/wp-content/blogs.dir/5/files/pictures.jpg. Kalau tidak, tidak ada jalan lain.

Jawaban panjang

Ada banyak yang bisa dijelaskan tentang proses ini, dan saya tidak 100% yakin dengan tingkat detail yang Anda cari, jadi saya akan membahas dasar-dasarnya di sini.

WordPress Multisite menyimpan file dengan blog_id("5" setelah "/blogs.dir/") untuk menjaga semuanya tetap teratur dan memisahkan file-file situs yang berbeda. Struktur direktori ini tidak dimaksudkan untuk umum. WordPress menggunakan aturan penulisan ulang untuk dirutekan ^files/(.+)ke wp-includes/ms-files.php?file=$1, dan kemudian wp-includes/ms-files.phpmemproses dan menampilkan gambar dan / atau beberapa header bermanfaat. Ada beberapa keuntungan untuk ini:

  • Dalam hal keamanan, lebih sedikit informasi selalu lebih baik. "wp-content / blogs.dir / 5" adalah TMI kecil - katanya Anda menjalankan WordPress Multisite dan itu blog_idadalah 5.
  • Struktur URL identik dengan instalasi satu situs. Jika Anda pernah memindahkan situs dari instalasi Multisite ke miliknya sendiri, Anda tidak perlu memperbarui referensi tersebut dalam database atau 301 jalur lama untuk referensi eksternal.
  • Anda dapat memindahkan direktori file dari akses publik atau deny from allmelalui .htaccessitu, misalnya, orang tidak dapat mengakses ukuran gambar asli jika Anda tidak mau.
  • Anda dapat menambahkan kontrol akses ke file tertentu

Ada satu kelemahan utama, yaitu bahwa gambar / file melewati PHP (dan mungkin bahkan memerlukan beberapa pertanyaan MySQL), sehingga membutuhkan lebih banyak sumber daya. Jika Anda telah menginstal plugin caching, sumber daya tambahan harus diabaikan.

Sehubungan dengan filter, Anda tidak dapat dengan mudah menyaring apa pun dalam proses karena satu alasan: baik plugin , plugin, atau tema Anda tidak dapat dimuat *. Yang terbaik yang dapat Anda lakukan adalah mengganti konstanta di wp-config.php. Berikut adalah konstanta yang paling berguna / relevan yang dapat Anda timpa:

if ( !defined( 'UPLOADBLOGSDIR' ) )
    define( 'UPLOADBLOGSDIR', 'wp-content/blogs.dir' );

if ( !defined( 'UPLOADS' ) ) {
    // Uploads dir relative to ABSPATH
    define( 'UPLOADS', UPLOADBLOGSDIR . "/{$wpdb->blogid}/files/" );
    if ( 'wp-content/blogs.dir' == UPLOADBLOGSDIR )
        define( 'BLOGUPLOADDIR', WP_CONTENT_DIR . "/blogs.dir/{$wpdb->blogid}/files/" );
}

/**
 * Optional support for X-Sendfile header
 */
if ( !defined( 'WPMU_SENDFILE' ) )
    define( 'WPMU_SENDFILE', false );

/**
 * Optional support for X-Accel-Redirect header
 */
if ( !defined( 'WPMU_ACCEL_REDIRECT' ) )
    define( 'WPMU_ACCEL_REDIRECT', false );

* Meskipun plugin tidak dimuat, drop-in melakukannya. Oleh karena itu, sementara Anda tidak dapat menggunakan plugin standar, WordPress masih meletakkan dasar untuk melakukan apa pun yang Anda butuhkan, seperti (seperti yang disebutkan di atas) menambahkan kontrol akses ke file sensitif. Drop-in sunrise.phpakan menjadi tempat yang baik untuk menambahkan kode tersebut.

Matthew Boynes
sumber
2

Dalam pemasangan instalasi multisite dengan WordPress 3.5 atau lebih baru, ms-files.phpdilewati secara langsung, dan blogs.dirtidak digunakan.

Alih-alih, unggahan disimpan di wp-content/blogs/{blog_id}dan dirujuk seperti itu. Ini berarti bahwa hanya ada satu cara untuk mengakses file pada instalasi subdomain, dan hanya dua pada instalasi subdirektori.

shea
sumber