Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating SEF urls using .htaccess

How can I change a url of the following format

  example.com/page/1

To

example.com/index.php?page=1

?

When I enter

example.com/page/1

it should redirect to

  example.com/index.php?page=1

What changes do I need to do in my .htaccess file?

folder structure is as follows

   -Public_html
      .htaccess
       index.php

Thanks.

like image 909
user4679529 Avatar asked Mar 21 '26 08:03

user4679529


2 Answers

Use this in your public_html/.htaccess file

   RewriteEngine on
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^page/([0-9])/?$ /index.php?page=$1 [QSA,NC,L]

RewriteCond checks if the requested filename or directory already exist, RewriteRule will be skipped.

like image 130
Amit Verma Avatar answered Mar 22 '26 21:03

Amit Verma


You can put this code in your htaccess

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9]+)$ index.php?page=$1 [NC,L]

With only this code, you can now access http://example.com/page/55 and see the content of /index.php?page=55 for instance.

But... the thing is, you're still able to access http://example.com/index.php?page=55 and it creates a duplicate content: very bad for referencing (Google, and others).

More info about duplicate content: here.

Solution: you can add another rule to redirect http://example.com/index.php?page=55 to http://example.com/page/55 (without any infinite loop)

RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} \s/index\.php\?page=([0-9]+)\s [NC]
RewriteRule ^ page/%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9]+)$ index.php?page=$1 [NC,L]

Note 1: make sure (in Apache configuration file) that you've enabled mod_rewrite and allowed htaccess files.

Note 2: since your rule creates a virtual directory (/page/) you'll have some problem if you're using relative paths for your html resources. Make sure all your links (js, css, images, href, etc) begins with a leading slash (/) or instead, add a base right after <head> html tag: <base href="/">

like image 42
Justin Iurman Avatar answered Mar 22 '26 22:03

Justin Iurman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!