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

时间:2011-07-29 19:44:33

标签: .htaccess mod-rewrite apache apache-config

我有一个索引文件,可根据 n PATH_INFO变量构建内容。

示例:

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]

此解决方案存在问题:

  • 不雅和不可扩展,需要每个子目录的手动行
  • 使用非字母数字字符(主要是+,=和&)ex失败site.com/ab&c/de+f/ (注意,即使将正则表达式更改为^([a-zA-Z0-9 _- \ + \ = \ _& ] +)/?$也无济于事,实际上完全错误了)

你能帮忙吗?

3 个答案:

答案 0 :(得分:6)

选项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]标记...因此您的模式中无需A-Z

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]

实际上,如果您不打算在任何地方显示该网址(例如,301重定向等),最后一行可以轻松替换为RewriteRule .* index.php [L] - 您将使用{{1}查找原始网址无论如何,在你的PHP代码中。

答案 1 :(得分:3)

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

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

然后,您可以通过解析'REQUEST_URI'

在index.php中做出决定

答案 2 :(得分:0)

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

任何超出root路径的网址都会被重定向到root。

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