Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rewrite URL after redirecting 404 error htaccess

So I know this may seem a little strange but I for sake of consistency, I would like all my urls to appear in this form: http://domain.com/page/ So far I have gotten the regular pages working but I cannot seem to get the error pages working properly.

If the user visits a page or directory that does not exist, I would like the browser to hard redirect to: http://domain.com/404/ This directory, however, will not actually exist. The real location of the error page will be under /pages/errors/404.php

Also, although I do not need an exact answer for all the various errors (400, 401, 403, 404, 500), I will be applying whatever method is given to redirect all of these to their "proper" URL's (eg. http://domain.com/400/ http://domain.com/500/ etc.)

Any ideas?

like image 857
LeinardoSmtih Avatar asked Nov 13 '13 19:11

LeinardoSmtih


People also ask

How do I redirect 404 error to custom error page?

To have a custom 404 page for this error, we should edit our . htacess file, which is located under the root folder (usually inside the public_html folder for cPanel servers). If you can't find the . htacess file, you can simply create it.

How can I redirect and rewrite my urls with an .htaccess file?

Use a 301 redirect . htaccess to point an entire site to a different URL on a permanent basis. This is the most common type of redirect and is useful in most situations. In this example, we are redirecting to the "example.com" domain.

What is rewrite rule in htaccess?

htaccess rewrite rules can be used to direct requests for one subdirectory to a different location, such as an alternative subdirectory or even the domain root. In this example, requests to http://mydomain.com/folder1/ will be automatically redirected to http://mydomain.com/folder2/.


2 Answers

Try this in your .htaccess:

.htaccess

ErrorDocument 404 http://example.com/404/ ErrorDocument 500 http://example.com/500/ # or map them to one error document: # ErrorDocument 404 /pages/errors/error_redirect.php # ErrorDocument 500 /pages/errors/error_redirect.php  RewriteEngine On RewriteBase /  RewriteCond %{REQUEST_URI} ^/404/$ RewriteRule ^(.*)$ /pages/errors/404.php [L]  RewriteCond %{REQUEST_URI} ^/500/$ RewriteRule ^(.*)$ /pages/errors/500.php [L]  # or map them to one error document: #RewriteCond %{REQUEST_URI} ^/404/$ [OR] #RewriteCond %{REQUEST_URI} ^/500/$ #RewriteRule ^(.*)$ /pages/errors/error_redirect.php [L] 

The ErrorDocument redirects all 404s to a specific URL, all 500s to another url (replace with your domain).

The Rewrite rules map that URL to your actual 404.php script. The RewriteCond regular expressions can be made more generic if you want, but I think you have to explicitly define all ErrorDocument codes you want to override.

Local Redirect:

Change .htaccess ErrorDocument to a file that exists (must exist, or you'll get an error):

ErrorDocument 404 /pages/errors/404_redirect.php 

404_redirect.php

<?php    header('Location: /404/');    exit; ?> 

Redirect based on error number

Looks like you'll need to specify an ErrorDocument line in .htaccess for every error you want to redirect (see: Apache ErrorDocument and Apache Custom Error). The .htaccess example above has multiple examples in it. You can use the following as the generic redirect script to replace 404_redirect.php above.

error_redirect.php

<?php    $error_url = $_SERVER["REDIRECT_STATUS"] . '/';    $error_path = $error_url . '.php';     if ( ! file_exists($error_path)) {       // this is the default error if a specific error page is not found       $error_url = '404/';    }     header('Location: ' . $error_url);    exit; ?> 
like image 103
Jay Avatar answered Sep 20 '22 17:09

Jay


Put this code in your .htaccess file

RewriteEngine On ErrorDocument 404 /404.php 

where 404.php is the file name and placed at root. You can put full path over here.

like image 44
Ashwani Panwar Avatar answered Sep 19 '22 17:09

Ashwani Panwar