如果.htaccess中没有模式匹配,如何重定向到主页

时间:2013-02-01 20:50:03

标签: php apache .htaccess mod-rewrite redirect

朋友我是.htaccess和Rewrite Rule的新手,对这些规则非常困惑。我正在尝试为index.php页面执行以下这些行。 当我在url中写入一个或两个或三个或四个查询参数时,它就可以了。任何这些模式匹配我收集查询并继续在PHP中进行。但是当查询参数超过四个参数(比如有人试图提供错误的URL)时,我想将页面重定向到主页。我没有在互联网上找到任何解决方案。任何人都可以帮助我,如何做到这一点。 我迫切需要一个解决方案来完成这个项目并且非常迫切需要。我读了很多文章,但不明白如何处理这个问题。我在Win 7上使用XAMPP执行这些所有任务。我使用的模式是,

RewriteRule ^([a-zA-Z0-9 _] +)/?$ index.php?levelone = $ 1 [NC]

RewriteRule ^([a-zA-Z0-9 _] +)/([a-zA-Z0-9 _] +)/?$ index.php?levelone = $ 1& leveltwo = $ 2 [NC]

RewriteRule ^([a-zA-Z0-9 _] +)/([a-zA-Z0-9 _] +)/([a-zA-Z0-9 _] +)/?$ index.php? levelone = $ 1& leveltwo = $ 2& levelthree = $ 3 [NC]

RewriteRule ^([a-zA-Z0-9 _] +)/([a-zA-Z0-9 _] +)/([a-zA-Z0-9 _] +)/([a-zA- Z0-9 _] +)/?$ index.php?llevelone = $ 1& leveltwo = $ 2& levelthree = $ 3& levelfour = $ 4 [NC]


网址示例: (比如localhost / myproject / index.php是我的主页)

本地主机/ myproject的/ LEVELONE /

本地主机/ myproject的/ LEVELONE / leveltwo /

本地主机/ myproject的/ LEVELONE / leveltwo / levelthree /

本地主机/ myproject的/ LEVELONE / leveltwo / levelthree / levelfour

当我使用这四个网址时,没关系,但如果我使用

本地主机/ myproject的/ index.php的/ LEVELONE / leveltwo / levelthree / levelfour / levelfive / levelsix /

然后我的index.php页面返回一些没有样式和布局的html,我在.htaccess中尝试了许多类型的RewriteCond和命令,但都是徒劳的。

我想查询字符串参数必须在1到4的范围内,如果超出范围说五个参数,那么页面必须再次重定向到主页(/index.php),否则匹配模式。 如果有人知道是否有办法将所有这四种长模式合并在一条短线中以匹配四种中的任何一种,这对我有帮助。

2 个答案:

答案 0 :(得分:2)

只有在没有已存在的文件或目录时,才会启用此重写规则。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /path/to/index.php [L,QSA]

如果文件不存在,-f标志将仅重写,而-d标志将确保在目录存在时重写不会启动。

答案 1 :(得分:1)

我建议避免重定向到主页。 在index.php中,如果没有设置任何级别变量,则默认显示主页内容。

这是一条单线规则(也许它可以简化得更多):

RewriteRule ^(?:([a-zA-Z0-9_]+)\/)?(?:([a-zA-Z0-9_]+)\/)?(?:([a-zA-Z0-9_]+)\/)?(?:([a-zA-Z0-9_]+)\/)?$ index.php?level1=$1&level2=$2&level3=$3&level4=$4 [L]

PHP:

$levels=array();

foreach (range(1,4) as $i) {
  if (isset($_GET['level'.$i])) {$levels[$i]=$_GET['level'.$i];}
}

if (!empty($levels)) {
  // show level content
} else {
  // show home page
}