user4679529
user4679529

Reputation: 341

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.

Upvotes: 3

Views: 1883

Answers (3)

talsibony
talsibony

Reputation: 8756

in my answer I assume you are using linux, I also assume you will have more complicated cases such as more than one parameters you will want to catch

example.com/page/1/3 in this case I think you will have to use parsing the url in your index.php

first you will have to setup the .htaccess file in your site root, also you will have to make sure mod_rewrite is enabled in your apache configuration

in case you are running debian you can run this command in terminal to make sure this mod is enabled:

sudo a2enmod rewrite 

add htaccess file to the root of where your index php file is located example:

/var/www/html/.htaccess

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^.*$ ./index.php
</IfModule>

according to my solution in your index.php you must have function that can parse the url request

/*
$base path is used only if you running your site under folder
example.com/mysitefolde/index.php
*/
function getUrlParams($basePath = ''){
  $request  = str_replace($basePath, "", $_SERVER['REQUEST_URI']);
  return  explode('/', $request);
}

index.php request to example.com/page/1/2

$request = getUrlParams($rootPath);
$module = $request[0]; // page
$moduleValue = $request[1]; // 1
$moduleValue2 = $request[2]; // 2

Upvotes: 2

Justin Iurman
Justin Iurman

Reputation: 19016

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="/">

Upvotes: 2

Amit Verma
Amit Verma

Reputation: 41219

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.

Upvotes: 2

Related Questions