All Projects → illuminatech → url-trailing-slash

illuminatech / url-trailing-slash

Licence: other
Allows enforcing URL routes with or without trailing slash

Programming Languages

PHP
23972 projects - #3 most used programming language

Projects that are alternatives of or similar to url-trailing-slash

node-match-path
Matches a URL against a path. Parameters, wildcards, RegExp.
Stars: ✭ 30 (-14.29%)
Mutual labels:  url, routing, route
url
Build and parse URLs. Useful for HTTP and "routing" in single-page apps (SPAs)
Stars: ✭ 69 (+97.14%)
Mutual labels:  url, routing
koii
A simple middleware for displaying routes in an express application
Stars: ✭ 73 (+108.57%)
Mutual labels:  routing, route
path-to-regexp-php
PHP port of https://github.com/pillarjs/path-to-regexp
Stars: ✭ 21 (-40%)
Mutual labels:  routing, route
STCRouter
基于标准URL的iOS路由系统,可实现业务模块组件化,控制器之间零耦合,可实现黑白名单控制,可进行native降级到hybrid。
Stars: ✭ 19 (-45.71%)
Mutual labels:  routing, route
golgi
A composable routing library for Haxe.
Stars: ✭ 37 (+5.71%)
Mutual labels:  url, routing
Ffrouter
Powerful and easy-to-use URL routing library in iOS that supports URL Rewrite(强大、易用、支持 URL Rewrite的 iOS 路由库)
Stars: ✭ 263 (+651.43%)
Mutual labels:  url, routing
Djurl
Simple yet helpful library for writing Django urls by an easy, short and intuitive way.
Stars: ✭ 85 (+142.86%)
Mutual labels:  url, routing
React Easy Params
🔗 Auto synchronize your state with the URL and LocalStorage.
Stars: ✭ 73 (+108.57%)
Mutual labels:  url, routing
Bidi
Bidirectional URI routing
Stars: ✭ 941 (+2588.57%)
Mutual labels:  url, routing
Django Multiurl
Have you ever wanted multiple views to match to the same URL? Now you can.
Stars: ✭ 268 (+665.71%)
Mutual labels:  url, routing
Url Parser
Parse URLs into nicely structured data
Stars: ✭ 118 (+237.14%)
Mutual labels:  url, routing
vue-error-page
[NO LONGER MAINTAINED] Provides a wrapper for router-view that allows you to show error pages without changing the URL.
Stars: ✭ 52 (+48.57%)
Mutual labels:  routing, route
UnboundBL
🛑 DNSBL (adblock) on OPNsense with UnboundBL & Unbound DNS
Stars: ✭ 63 (+80%)
Mutual labels:  url
vue-route-generator
Vue Router route config generator
Stars: ✭ 146 (+317.14%)
Mutual labels:  routing
balanceofsatoshis
Tool for working with the balance of your satoshis on LND
Stars: ✭ 447 (+1177.14%)
Mutual labels:  routing
lwip nat arduino
lwip library with NAT feature for Arduino environment
Stars: ✭ 55 (+57.14%)
Mutual labels:  routing
Feliz.Router
A router component for React and Elmish that is focused, powerful and extremely easy to use.
Stars: ✭ 66 (+88.57%)
Mutual labels:  routing
web-components-hooks-demo
web components hooks demo
Stars: ✭ 17 (-51.43%)
Mutual labels:  routing
ember-contextual-services
Services in Ember are scoped to the app as a whole and are singletons. Sometimes you don't want that. :) This addon provides ephemeral route-based services.
Stars: ✭ 20 (-42.86%)
Mutual labels:  route

Laravel URL Route Trailing Slash


This extension allows enforcing URL routes with or without trailing slash.

For license information check the LICENSE-file.

Latest Stable Version Total Downloads Build Status

Installation

The preferred way to install this extension is through composer.

Either run

php composer.phar require --prefer-dist illuminatech/url-trailing-slash

or add

"illuminatech/url-trailing-slash": "*"

to the require section of your composer.json.

Once package is installed you should manually register \Illuminatech\UrlTrailingSlash\RoutingServiceProvider instance at your application in the way it comes before kernel instantiation, e.g. at the application bootstrap stage. This can be done in 'bootstrap/app.php' file of regular Laravel application. For example:

<?php

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);
// ...

$app->register(new Illuminatech\UrlTrailingSlash\RoutingServiceProvider($app)); // register trailing slashes routing

return $app;

Note: \Illuminatech\UrlTrailingSlash\RoutingServiceProvider can not be registered in normal way or be automatically discovered by Laravel, since it alters the router, which is bound to the HTTP kernel instance at constructor level.

In order to setup automatic redirection for the routes with trailing slash add \Illuminatech\UrlTrailingSlash\Middleware\RedirectTrailingSlash middleware to your HTTP kernel. For example:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middlewareGroups = [
        'web' => [
            \Illuminatech\UrlTrailingSlash\Middleware\RedirectTrailingSlash::class, // enable automatic redirection on incorrect URL trailing slashes
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // ...
        ],
    
        'api' => [
            // probably you do not need trailing slash redirection anywhere besides public web routes,
            // thus there is no reason for addition its middleware to other groups, like API
            'throttle:60,1',
            // ...
        ],
    ];
    // ...
}

Heads up! Make sure you do not have any trailing slash redirection mechanism at the server configuration level, which may conflict with \Illuminatech\UrlTrailingSlash\Middleware\RedirectTrailingSlash. Remember, that by default Laravel application is shipped with .htaccess file, which contains redirection rule enforcing trailing slash absence in project URLs. Make sure you adjust or disable it, otherwise your application may end in infinite redirection loop.

Usage

This extension allows enforcing URL routes with or without trailing slash. You can decide per each route, whether its URL should have a trailing slash or not, simply adding or removing slash symbol ('/') in particular route definition.

In case URL for particular route is specified with the trailing slash - it will be enforced for this route, and request without slash in the URL ending will cause 301 redirection. In case URL for particular route is specified without the trailing slash - its absence will be enforced for this route, and request containing slash in the URL end will cause 301 redirection.

For example:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Route;

Route::get('items/', ItemController::class.'@index')->name('items.index'); // enforce trailing slash
Route::get('items/{item}', ItemController::class.'@show')->name('items.show'); // enforce no trailing slash

// ...

echo route('items.index'); // outputs: 'http://example.com/items/'
echo route('items.show', [1]); // outputs: 'http://example.com/items/1'

Tip: the best SEO practice is having trailing slash at the URLs, which have nested pages, e.g. "defines a folder", and have no trailing slashes at the URLs without nested pages, e.g. "pathname of the file".

In case you have setup \Illuminatech\UrlTrailingSlash\Middleware\RedirectTrailingSlash middleware, application will automatically redirect request with incorrect URL according to the routes definition. For the example above: request of http://example.com/items causes redirect to http://example.com/items/ while request to http://example.com/items/1/ causes redirect to http://example.com/items/1.

Heads up! Remember, that with this extension installed, you are controlling requirements of URL trailing slashes presence or absence in each route you define. While normally Laravel strips any trailing slashes from route URL automatically, this extension gives them meaning. You should carefully examine your routes definitions, ensuring you do not set trailing slash for the wrong ones.

Slash in Root URL

Unfortunally this extension is unable to handle trailing slashes for the project root URL, e.g. for a 'home' page. In other words \Illuminatech\UrlTrailingSlash\Middleware\RedirectTrailingSlash middleware is unable to distinguish URL like http://examle.com from http://examle.com/. This restriction caused by PHP itself, as $_SERVER['REQUEST_URI'] value equals to '/' in both cases.

You'll have to deal with trailing slash for root URL separately at the server settings level.

Resource Routes

You can define trailing slash presence for resource URLs using the same notation as for regular routes. In case resource name is specified with trailing slash, all its URLs will have it. For example:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Route;

Route::resource('items/', ItemController::class); // enforce trailing slash
Route::resource('categories', CategoryController::class); // enforce no trailing slash

// ...

echo route('items.index'); // outputs: 'http://example.com/items/'
echo route('items.show', [1]); // outputs: 'http://example.com/items/1/'

echo route('categories.index'); // outputs: 'http://example.com/categories'
echo route('categories.show', [1]); // outputs: 'http://example.com/categories/1'

You can control trailing slash presence per each resource route using options 'trailingSlashOnly' and 'trailingSlashExcept' options. These ones behave in similar to regular 'only' and 'except', specifying list of resource controller methods, which should or should not have a trailing slash in their URL. For example:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Route;

Route::resource('items', ItemController::class, ['trailingSlashOnly' => 'index']); // trailing slash will be present only for 'index'
Route::resource('categories', CategoryController::class, ['trailingSlashExcept' => 'show']); // trailing slash will be present for all but 'show'

// ...

echo route('items.index'); // outputs: 'http://example.com/items/'
echo route('items.show', [1]); // outputs: 'http://example.com/items/1'

echo route('categories.index'); // outputs: 'http://example.com/categories/'
echo route('categories.show', [1]); // outputs: 'http://example.com/categories/1'

Note: 'trailingSlashExcept' option takes precedence over 'trailingSlashOnly'.

Trailing Slash in Pagination

Unfortunately, the trailing slash will not automatically appear at pagination URLs. The problem is that Laravel paginators trim the trailing slashes from the URL path at the constructor level. Thus even adjustment of \Illuminate\Pagination\Paginator::currentPathResolver() can not fix the problem.

In case you need a pagination at the URL endpoint with a trailing slash, you should manually set the path for it, using \Illuminate\Pagination\AbstractPaginator::withPath(). For example:

<?php

use App\Models\Item;
use Illuminate\Support\Facades\URL;

$items = Item::query()
    ->paginate()
    ->withPath(URL::current());

Trailing Slash in Unit Tests

Since Illuminatech\UrlTrailingSlash\RoutingServiceProvider can not be registered as regular data provider, while writing unit and feature tests you will have to manually register it within test application before test kernel instantiation. This can be done within your \Tests\CreatesApplication trait:

<?php

namespace Tests;

use Illuminate\Contracts\Console\Kernel;
use Illuminatech\UrlTrailingSlash\RoutingServiceProvider;

trait CreatesApplication
{
    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->register(new RoutingServiceProvider($app)); // register trailing slashes routing

        $app->make(Kernel::class)->bootstrap();

        return $app;
    }
}

However, this in not enough to make tests running correctly, because Laravel automatically strips trailing slashes from requests URL before staring test HTTP request. Thus you will need to override \Illuminate\Foundation\Testing\Concerns\MakesHttpRequests::prepareUrlForRequest() in the way it respects trailing slashes. This can be achieved using Illuminatech\UrlTrailingSlash\Testing\AllowsUrlTrailingSlash trait. For example:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminatech\UrlTrailingSlash\Testing\AllowsUrlTrailingSlash;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
    use AllowsUrlTrailingSlash;
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].