1

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

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

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

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

重写规则 ^([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]


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

本地主机/myproject/levelone/

本地主机/我的项目/levelone/leveltwo/

本地主机/myproject/levelone/leveltwo/levelthree/

本地主机/我的项目/levelone/leveltwo/levelthree/levelfour

当我使用这四个 Url 时就可以了,但是如果我使用

localhost/myproject/index.php/levelone/leveltwo/levelthree/levelfour/levelfive/levelsix/

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

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

4

2 回答 2

2

仅当不存在已存在的文件或目录时,此重写规则才会生效。

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

-f 标志将仅在文件不存在时才开始重写,而 -d 标志将确保在目录存在时不会开始重写。

于 2015-12-02T17:54:54.773 回答
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
}
于 2013-02-01T21:30:17.873 回答