web-dev-qa-db-fra.com

Comment puis-je servir un fichier texte à une URL personnalisée

J'ai un site WordPress installé à la racine du serveur Web: / Je veux servir un fichier texte à partir d'ici: /.hiddendir/secondlevel/textfile

J'ai créé ce fichier et répertoire sur le serveur à ../wwwroot/.hiddendir/secondlevel/textfile

Lorsque j'essaie d'accéder, je reçois un 404 de wordpress.

La raison en est d’ajouter un fichier de "vérification" requis pour un service que je veux utiliser, il se base sur une URL pour vérifier que vous êtes le propriétaire du site Web (yahoo et google le font pour leurs divers services).

J'ai essayé d'ajouter le fichier texte à la médiathèque, mais l'URL ne peut pas être personnalisé. Je cherche un plugin, mais je ne peux pas en trouver un.

Vous pouvez utiliser add_rewrite_rule pour créer un nouveau point de terminaison tel que http://example.com/api/files/xyz, qui traite la demande et en rend le contenu. votre serveur. Cela vous permet de masquer l’origine du fichier mais d’accéder toujours à son contenu.

add_rewrite_rule vous requiert flush_rewrite_rules mais vous devez le faire seulement une fois à chaque fois vous apportez une modification à vos réécritures. Donc, essentiellement, laissez cette ligne à tester, mais supprimez-la pendant la production.

Une fois que vous avez déterminé que l’URL demande un fichier et quel fichier vous souhaitez présenter, effectuez une vérification rapide is_readable pour vous assurer que le file exists et vous avez accès au contenu.

À ce stade, vous pouvez écrire des en-têtes décrivant le fichier, lire le contenu et écrire dans le tampon de sortie avec readfile .

Vous pouvez déposer ceci dans votre functions.php ou dans un plugin pour autoriser l'accès quel que soit le thème.

Les descriptions sont dans les commentaires de code.

<?php

if ( ! class_exists( 'FileEndpoint' ) ):

    class FileEndpoint {
        const ENDPOINT_QUERY_NAME  = 'api/files';
        const ENDPOINT_QUERY_PARAM = '__api_files';

        // WordPress hooks

        public function init() {
            add_filter( 'query_vars', array ( $this, 'add_query_vars' ), 0 );
            add_action( 'parse_request', array ( $this, 'sniff_requests' ), 0 );
            add_action( 'init', array ( $this, 'add_endpoint' ), 0 );
        }

        // Add public query vars

        public function add_query_vars( $vars ) {

            // add all the things we know we'll use

            $vars[] = static::ENDPOINT_QUERY_PARAM;
            $vars[] = 'file';

            return $vars;
        }

        // Add API Endpoint

        public function add_endpoint() {
            add_rewrite_rule( '^' . static::ENDPOINT_QUERY_NAME . '/([^/]*)/?', 'index.php?' . static::ENDPOINT_QUERY_PARAM . '=1&file=$matches[1]', 'top' );

            //////////////////////////////////
            flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE
            //////////////////////////////////
        }

        // Sniff Requests

        public function sniff_requests( $wp_query ) {
            global $wp;

            if ( isset(
                $wp->query_vars[ static::ENDPOINT_QUERY_PARAM ],
                $wp->query_vars[ 'file' ] ) ) {
                $this->handle_file_request(); // handle it
            }
        }

        // Handle Requests

        protected function handle_file_request() {
            global $wp;

            $file     = $wp->query_vars[ 'file' ];
            $filepath = '';

            switch ( $file ) {

                // example.com/api/files/xyz
                case 'xyz':
                    $filepath = __DIR__ . '/filename.txt';
                    break;
            }

            if ( ! empty( $filepath ) ) {

                // Make sure this is an accessible file
                // If we can't read it throw an Error
                if ( ! is_readable( $filepath ) ) {

                    $err = new WP_Error( "Forbidden", "Access is not allowed for this request.", 403 );
                    wp_die( $err->get_error_message(), $err->get_error_code() );
                }

                // We can read it, so let's render it
                $this->serve_file( $filepath );
            }

            // Nothing happened, just give some feedback
            $err = new WP_Error( "Bad Request", "Invalid Request.", 400 );
            wp_die( $err->get_error_message(), $err->get_error_code() );
        }

        // Output the file

        protected function serve_file( $filepath, $force_download = false ) {

            if ( ! empty ( $contents ) ) {

                // Write some headers

                header( "Cache-control: private" );
                if ( $force_download ) {

                    // Allow a forced download
                    header( "Content-type: application/force-download" );
                    header( "Content-disposition: attachment; filename=\"filename.txt\"" );
                }
                header( "Content-transfer-encoding: binary\n" );
                header( "Content-Length: " . filesize( $filepath ) );

                // render the contents of the file
                readfile( $filepath );

                // kill the request. Nothing else to do now.
                exit;
            }

            // nothing happened, :(
            return false;
        }
    }

    $wpFileEndpoint = new FileEndpoint();
    $wpFileEndpoint->init();

endif; // FileEndpoint
2
jgraup