Reputation: 449
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
Reputation: 785146
Looks like you are trying to hide PHP extension with the priority set to:
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
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