2

I ran into an issue updating Craft and Craft Commerce in my development environment.

I am using Laravel Valet. As soon as I want to update (tried manual as well) Craft will throw the error :

Unable to determine URL path info. Please make sure $_SERVER["PATH_INFO"] (or $_SERVER["PHP_SELF"] and $_SERVER["SCRIPT_NAME"]) contains proper value.
Please talk to your host/IT department about upgrading your server.

The Error in the logs is:

2017/03/09 16:11:10 [error] [exception.Craft\HttpException.400] Craft\HttpException in /Users/hendrik/Documents/Github/Projects/app/dist/craft/app/controllers/BaseController.php:217
    Stack trace: -0 /Users/hendrik/Documents/Github/Projects/app/dist/craft/app/controllers/UpdateController.php(192): Craft\BaseController->requireAjaxRequest() -1 /Users/hendrik/Documents/Github/Projects/app/dist/craft/app/framework/web/actions/CInlineAction.php(49): Craft\UpdateController->actionPrepare()

I already figured that setting $_SERVER['PHP_SELF'] to the same value as $_SERVER['SCRIPT_NAME'] would solve the issue, but I cant make it work somehowe... I am sure I am missing something, my project folder structure is:

App
|-- dist
|   |-- craft
|   `-- public
`-- src
    `-- index.php

And this is the Valet CraftMultiLocaleValetDriver.php I am using:

<?php

class CraftMultiLocaleValetDriver extends ValetDriver
{
    /**
     * Determine if the driver serves the request.
     *
     * @param  string  $sitePath
     * @param  string  $siteName
     * @param  string  $uri
     * @return bool
     */
    public function serves($sitePath, $siteName, $uri)
    {
        return is_dir($sitePath.'/craft');
    }

    /**
     * Determine if the incoming request is for a static file.
     *
     * @param  string  $sitePath
     * @param  string  $siteName
     * @param  string  $uri
     * @return string|false
     */
    public function isStaticFile($sitePath, $siteName, $uri)
    {
        if ($this->isActualFile($staticFilePath = $sitePath.'/public'.$uri)) {
            return $staticFilePath;
        }

        return false;
    }

    /**
     * Get the fully resolved path to the application's front controller.
     *
     * @param  string  $sitePath
     * @param  string  $siteName
     * @param  string  $uri
     * @return string
     */
    public function frontControllerPath($sitePath, $siteName, $uri)
    {
        // Default index path
        $indexPath = $sitePath.'/src/index.php';
        $scriptName = '/index.php';

        // Check if the first URL segment matches any of the defined locales
        $locales = [
            'ar',
            'ar_sa',
            'bg',
            'bg_bg',
            'ca_es',
            'cs',
            'cy_gb',
            'da',
            'da_dk',
            'de',
            'de_at',
            'de_ch',
            'de_de',
            'el',
            'el_gr',
            'en',
            'en_as',
            'en_au',
            'en_bb',
            'en_be',
            'en_bm',
            'en_bw',
            'en_bz',
            'en_ca',
            'en_dsrt',
            'en_dsrt_us',
            'en_gb',
            'en_gu',
            'en_gy',
            'en_hk',
            'en_ie',
            'en_in',
            'en_jm',
            'en_mh',
            'en_mp',
            'en_mt',
            'en_mu',
            'en_na',
            'en_nz',
            'en_ph',
            'en_pk',
            'en_sg',
            'en_shaw',
            'en_tt',
            'en_um',
            'en_us',
            'en_us_posix',
            'en_vi',
            'en_za',
            'en_zw',
            'en_zz',
            'es',
            'es_cl',
            'es_es',
            'es_mx',
            'es_us',
            'es_ve',
            'et',
            'fi',
            'fi_fi',
            'fil',
            'fr',
            'fr_be',
            'fr_ca',
            'fr_ch',
            'fr_fr',
            'fr_ma',
            'he',
            'hr',
            'hr_hr',
            'hu',
            'hu_hu',
            'id',
            'id_id',
            'it',
            'it_ch',
            'it_it',
            'ja',
            'ja_jp',
            'ko',
            'ko_kr',
            'lt',
            'lv',
            'ms',
            'ms_my',
            'nb',
            'nb_no',
            'nl',
            'nl_be',
            'nl_nl',
            'nn',
            'nn_no',
            'no',
            'pl',
            'pl_pl',
            'pt',
            'pt_br',
            'pt_pt',
            'ro',
            'ro_ro',
            'ru',
            'ru_ru',
            'sk',
            'sl',
            'sr',
            'sv',
            'sv_se',
            'th',
            'th_th',
            'tr',
            'tr_tr',
            'uk',
            'vi',
            'zh',
            'zh_cn',
            'zh_tw',
        ];
        $parts = explode('/', $uri);

        if (count($parts) > 1 && in_array($parts[1], $locales)) {
            $indexPath = $sitePath.'/src/'. $parts[1] .'/index.php';
            $scriptName = '/' . $parts[1] . '/index.php';
        }

        $_SERVER['SCRIPT_FILENAME'] = $indexPath;
        $_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
        $_SERVER['SCRIPT_NAME'] = $scriptName;

        return $indexPath;
    }
}

I just put it in the .Valet/drivers/ folder and restarted Valet, what am i missing, how can i check of the path is set right?

Thanks a lot.

1

I forgot to add that i use https://github.com/nystudio107/craft-multi-environment as a flexible multi-environment config for Craft CMS.

I managed to fix the issue setting two variables to the linked valet url in the public/index.php:

$_SERVER['PHP_SELF'] = 'valeturl.dev';
$_SERVER['SCRIPT_NAME'] = 'valeturl.dev';

now all the updates etc work as expected.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.