.htaccess重写root来获取动作

时间:2015-02-28 13:06:26

标签: php apache .htaccess mod-rewrite

我有以下代码,其目的是根据网址中指定的操作将用户定向到不同的functions

$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");
}

我想将用户引导至homepage,如果他们在索引或/上。

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]

但是当开启domain.com/时,开关默认为。

2 个答案:

答案 0 :(得分:2)

嗯,这不是.htaccess问题。这是你的代码。我会使用这个.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]

因此,所有请求都直接转到index.php,而您的“路由器”应该是:

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

因为如果没有指定$action将其设置为空字符串,所以切换默认值。

P.S。:只是一个建议。不要构建自己的CMS,使用框架或其他任何东西。最好是专注于您的产品而不是开发工具。

<强>更新

正如OP建议的那样,RewriteRule可以是:

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

Hovewer,在我的示例.htaccess中来自 HTML5 Boilerplate ,因此它经过测试并适用于大多数情况(也适用于我)。

答案 1 :(得分:1)

您可以使用:

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]