diff --git a/app/Helpers/Common.php b/app/Helpers/Common.php new file mode 100644 index 0000000000..25a1aa34cf --- /dev/null +++ b/app/Helpers/Common.php @@ -0,0 +1,54 @@ +. + * + * @package LibreNMS + * @link http://librenms.org + * @copyright 2018 Tony Murray + * @author Tony Murray + */ + +if (!function_exists('str_start')) { + /** + * Begin a string with a single instance of a given value. + * + * @param string $value + * @param string $prefix + * @return string + */ + function str_start($value, $prefix) + { + $quoted = preg_quote($prefix, '/'); + return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); + } +} + +if (!function_exists('str_finish')) { + /** + * Cap a string with a single instance of a given value. + * + * @param string $value + * @param string $cap + * @return string + */ + function finish($value, $cap) + { + $quoted = preg_quote($cap, '/'); + return preg_replace('/(?:' . $quoted . ')+$/u', '', $value) . $cap; + } +} diff --git a/app/Helpers/HelperOverload.php b/app/Helpers/HelperOverload.php new file mode 100644 index 0000000000..125d435c7f --- /dev/null +++ b/app/Helpers/HelperOverload.php @@ -0,0 +1,54 @@ +. + * + * @package LibreNMS + * @link http://librenms.org + * @copyright 2018 Tony Murray + * @author Tony Murray + */ + +// override the default route helper to provide support for proxy with subdir and app without +if (!function_exists('route')) { + /** + * Generate the URL to a named route. + * + * @param string $name + * @param array $parameters + * @param bool $absolute + * @return string + */ + function route($name, $parameters = [], $absolute = true) + { + $appUrlSuffix = config('app.url_suffix'); + + // Additional check, do the workaround only when a suffix is present and only when urls are absolute + if ($appUrlSuffix && $absolute) { + $appUrl = config('app.url'); // in your case: http://app.dev + + // Add the relative path to the app root url + $relativePath = app('url')->route($name, $parameters, false); + $url = $appUrl.$relativePath; + } else { + // This is the default behavior of route() you can find in laravel\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php + $url = app('url')->route($name, $parameters, $absolute); + } + + return $url; + } +} diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php index cf096dd967..a2221b9564 100644 --- a/bootstrap/autoload.php +++ b/bootstrap/autoload.php @@ -14,6 +14,7 @@ define('LARAVEL_START', microtime(true)); | */ +include __DIR__ . '/../app/Helpers/HelperOverload.php'; @include __DIR__ . '/../vendor/autoload.php'; if (!class_exists(\App\Checks::class)) { diff --git a/composer.json b/composer.json index 3e1c49b61f..059e64c759 100644 --- a/composer.json +++ b/composer.json @@ -67,6 +67,9 @@ "ext-mysqlnd": "*" }, "autoload": { + "files": [ + "app/Helpers/Common.php" + ], "psr-4": { "App\\": "app", "LibreNMS\\": "LibreNMS", diff --git a/config/app.php b/config/app.php index ae84631dbb..3b2e142341 100644 --- a/config/app.php +++ b/config/app.php @@ -53,6 +53,18 @@ return [ 'url' => env('APP_URL'), + /* + |-------------------------------------------------------------------------- + | Application URL Suffix + |-------------------------------------------------------------------------- + | + | Required when the application is accessed via a proxy using a subdirectory + | but the application itself is not accessed via a subdirectory + | + */ + + 'url_suffix' => env('APP_URL_SUFFIX'), + /* |-------------------------------------------------------------------------- | Application Timezone diff --git a/routes/web.php b/routes/web.php index fc98a955cc..4006fe38ea 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,11 @@ | */ +// handle proxy with subdirectory and app without +if ($appUrl = trim(config('app.url'), '/')) { + \URL::forceRootUrl(str_finish(config('app.url'), '/') . config('app.url_suffix')); +} + // Auth Auth::routes();