Jan Peter
Jan Peter

Reputation: 920

Url Rewriting doesn't work with Apache

I want the following:

myhomepage.com <- this should turn to this -> myhomepage.com/index.php

myhomepage.com/mypage <- should turn to this -> myhomepage.com/index.php?page=mypage

myhomepage.com/mypage/mymethod <- should turn to this -> myhomepage.com/index.php?page=mypage&method=mymethod

myhomepage.com/api/logout <- should turn to this -> myhomepage/api/logout.php

This is my .htaccess file:

RewriteEngine On

RewriteBase /

RewriteRule ^/api/(.*)$ api/$1.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)$ index.php?page=$1&method=$2&item=$3

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?page=$1&method=$2

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1

Everthing works as it should, but the rule with api doesn't seem to work.

UPDATE 1:

RewriteRule ^/api/(.*)$ api/$1.php

When I call myhomepage.com/api/logout it rewrites it to myhomepage.com/index.php?page=api&method=logout

UPDATE 2:

My first thought was, maybe there is something like a default rewrite_module. Which rewrites everything what's not a file, to index.html or something like that. Especially when I use XAMPP.

UPDATE 3:

After experimenting a little bit, I found out, that I can't call it with api because it is a directory. When I rewrite this for example with myhomepage.com/ap/logout and RewriteRule ^ap/(.*)$ api/$1.php it works fine. Any ideas how to get this work with the directory name?

UPDATE 4:

I redirect the link todo.js (from host in Windows/System32/drivers/etc) to 127.0.0.1 then I edited the httpd-vhosts.conf and added the following:

<VirtualHost todo.js:80>
    ServerAdmin [email protected]
    DocumentRoot "C:/xampp/htdocs/todo"
    ServerName todo.js
    ServerAlias todo.js
</VirtualHost>

And my api folder is a subdirectory of htdocs/todo

*SOLUTION: *

This is the final solution for my problem:

ErrorDocument 404 /error.php

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule api/([^/]+)/?$ api/$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)/(.*)$ index.php?page=$1&method=$2&item=$3 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.*)$ index.php?page=$1&method=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

Special thanks to anubhava!

Upvotes: 3

Views: 1250

Answers (2)

anubhava
anubhava

Reputation: 785146

Leading slash is not matched in .htaccess because .htaccess is per directory directive and Apache strips the current directory path (thus leading slash) from RewriteRule URI pattern.

Use these rules in your DOCUMENT_ROOT/.htaccess file:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule api/([^/]+)/?$ api/$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(.*)$ index.php?page=$1&method=$2&item=$3 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.*)$ index.php?page=$1&method=$2 [L,QSA]

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

Upvotes: 2

Andrew Schulman
Andrew Schulman

Reputation: 3544

Your first rule,

RewriteRule ^/api/(.*)/(.*)$ api/$1.php?item=$2

assumes that there will be a third path element, such as /api/logout/stuff. For the case where there's no third element, you need to add another rule below it:

RewriteRule ^/api/(.*) api/$1.php

Upvotes: 1

Related Questions