如何使用htaccess或httpd.conf将所有子目录redirect到root?

我有一个索引文件,根据n个 PATH_INFOvariables构build内容。

例:

site.com/A/B/n/ 

应该使用index.php:

 site.com/index.php?var1=A&var2=B&varN=n - or - site.com/index.php/A/B/n/ 

代替:

 site.com/A/B/n/index.php || which doesn't exist || 

到目前为止,我已经尝试了一些变体:

 RedirectMatch ^/.+/.*$ / 

没有成功。

我在这里有一个不雅而难以解决的问题:

 RewriteEngine On RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?p1=$1 [NC,L] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2 [NC,L] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [NC,L] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [NC,L] 

这个解决scheme的问题:

  • 不雅和不可缩放,需要每个子目录的手动线
  • 不带非字母数字字符(主要是+,=和&)ex。 site.com/ab&c/de+f/(注意,即使将正则expression式更改为^([a-zA-Z0-9_- \ + \ = \& ] +)/?$也没有什么帮助,并且实际上使错误完全)

你能帮我吗?

选项1 🙁 site.com/index.php?var1=A&var2=B&varN=n ):

 Options +FollowSymLinks -MultiViews RewriteEngine On # do not do anything for already existing files RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule .+ - [L] RewriteRule ^([^/]+)/?$ index.php?p1=$1 [QSA,L] RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2 [QSA,L] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [QSA,L] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [QSA,L] 

1.你有[NC]标志…所以没有必要在你的模式中有AZ

2.代替[a-zA-Z0-9_-\+\=\&][a-zA-Z0-9_-]我用[^/]表示除斜杠/之外的任何字符

3.添加了[QSA]标志以保留现有的查询字符串。

选项2:site.com/index.php/A/B/n/ ):

 Options +FollowSymLinks -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php/$1 [L] 

实际上,如果你不打算在任何地方显示这个URL(比如301重定向等),最后一行可以很容易地被RewriteRule .* index.php [L]替换RewriteRule .* index.php [L] – 你将使用$_SERVER['REQUEST_URI']查找原始URL $_SERVER['REQUEST_URI']在你的PHP代码中。

添加以下内容会将所有流量(对于不存在的文件)重定向到索引页面:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*) index.php [NC] 

然后,你可以通过解析'REQUEST_URI'来决定在index.php中,

RewriteRule ^ /。+ / [R = 301,L]

任何超出根目录的URL都将被重定向到根目录。

 ^ = start of url / = a slash .+ = 1 or more characters