ramadani
ramadani

Reputation: 449

How rewriting for directory in root directory

I want to change my url. Here I have a directory structure like this

htdocs/
      example/
              public/
                     login.php
                     people/
                            people1.php
                            people2.php
                     animal/
                            animal1.php
                            animal2.php
                     404.php
              assets/
                    css/
                    js/

then I want the url like below in accordance with the existing directory in the root

localhost/example/login
localhost/example/people/people1
localhost/example/people/people2
localhost/example/animal/animal1
localhost/example/animal/animal2

I've tried making an .htaccess file with the following contents

Options +FollowSymLinks
RewriteEngine On
rewritecond %{REQUEST_URI} !^/public/(.*)
rewritecond %{REQUEST_URI} !^/assets/(.*)
RewriteRule .* index.php [L]

and it's index.php

$requested = empty($_SERVER['REQUEST_URI']) ? false : $_SERVER['REQUEST_URI'];

switch ( $requested ) {

    case '/login':
        include 'public/login.php';
        break;
    default:
        include 'public/404.php';
}

when I headed localhost/example/login, but destination is 404.php (ERROR).

can you help me?

Upvotes: 6

Views: 76

Answers (2)

anubhava
anubhava

Reputation: 785146

Looks like you are trying to hide PHP extension with the priority set to:

  1. public directory
  2. elsewhere

Put this code in your DOCUMENT_ROOT/.htaccess file:

RewriteEngine On

# skip for existing files/directories (/assets will be skipped here)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# try to load PHP file from public directory
RewriteCond %{DOCUMENT_ROOT}/public/$1.php -f
RewriteRule ^(.+?)/?$ /public/$1.php [L]

# now try .php elsewhere
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ /$1.php [L]

Upvotes: 1

Jon Lin
Jon Lin

Reputation: 143886

The $_SERVER['REQUEST_URI'] variable is the entire URI. So if are going to http://example.com/example/login the $_SERVER['REQUEST_URI'] variable is /example/login. Something that you could try doing is changing your htaccess file to:

Options +FollowSymLinks
RewriteEngine On
rewritecond %{REQUEST_URI} !/public/(.*)
rewritecond %{REQUEST_URI} !/assets/(.*)
RewriteRule ^(.*)$ index.php/$1 [L]

(Note that ^/public/ will never match, because the REQUEST_URI would be /example/public)

Then in your code use $_SERVER['PATH_INFO'] instead.

Upvotes: 1

Related Questions