redirect 301 to / if url contains index.php

Tags: , , , ,



I have a blog in laravel 5.8 and I want to redirect 301 to / it there is index.php in the url.

My .htaccess is this

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle www + https
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www. [NC]
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect if index.php is in the URL
    RewriteCond %{THE_REQUEST} ^GET.*index.php [NC]
    RewriteRule (.*?)index.php/*(.*) /$1$2 [R=301,NE,L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

I have tried this approach:

    # Redirect if index.php is in the URL
    RewriteCond %{THE_REQUEST} ^GET.*index.php [NC]
    RewriteRule (.*?)index.php/*(.*) /$1$2 [R=301,NE,L]

but the problem is IF there is an url like this one that contains (?get_params)

htts://www.example.com/index.php?test

it will redirect 301 to /?test

How can I change the rule to redirect 301 to / (without any ? params) if the url contains index.php ?

Answer

You can use QSD flag (Query String Discard) to redirect without passing the query string.

When the requested URI contains a query string, and the target URI does not, the default behavior of RewriteRule is to copy that query string to the target URI. Using the [QSD] flag causes the query string to be discarded.

# Redirect if index.php is in the URL
RewriteCond %{THE_REQUEST} ^GET.*index.php [NC]
RewriteRule (.*?)index.php /$1 [R=301,NE,L,QSD]


Source: stackoverflow