简体   繁体   中英

.htaccess rewrite root to get action

I have the following code, its purpose is to direct the user to different functions depending on the action specified in a URL.

$action = isset( $_GET['action'] ) ? $_GET['action'] : "";

$action = strtolower($action);

switch ($action) {
  case 'viewproducts':
    viewProducts();
    break;
  case 'products':
    products();
    break;
  case 'homepage':
    homepage();
    break;
  default:
        header("HTTP/1.0 404 Not Found");
        include_once("404.html");
}

I would like to direct the user to homepage if they are on the index or / .

RewriteEngine On
#if not a directory listed above, rewrite the request to ?action=
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/$ index.php?action=homepage [L,QSA]
#RewriteRule ^(.*)$ index.php?action=$1 [L,QSA]

However when on domain.com/ the switch defaults.

Well, it's not the .htaccess issue. It's you code. I would use this .htaccess :

RewriteEngine On
RewriteBase /

## If the request is for a valid directory
RewriteCond %{REQUEST_FILENAME} -d [OR]
## If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
## If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
## don't do anything
RewriteRule ^ - [L]

RewriteRule ^(.*)$ index.php [L]

So all request just go straight to index.php , and in your "router" should be:

$action = isset( $_GET['action'] ) ? $_GET['action'] : "homepage";

Because you setting $action to empty string if it's not specified, so switch defaults.

PS: Just an advice. Do not build your own CMS , use frame or whatever. It's best to concentrate on your product than on development tools.

UPDATE

As OP suggested, RewriteRule can be:

RewriteRule ^(.*)$ index.php?action=$1 [L,QSA]

Hovewer, in my example .htaccess is from HTML5 Boilerplate , so it's tested and suitable for most cases (works for me as well).

You can use:

RewriteEngine On
RewriteBase /

RewriteRule ^/?$ index.php?action=homepage [L,QSA]

#if not a directory listed above, rewrite the request to ?action=
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?action=$1 [L,QSA]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM