1

我一直在使用我自己的自定义 CMS 在我的服务器上使用 .htaccess 脚本来清理 URL:

# this is the initialization
Options         +FollowSymLinks
RewriteEngine   On
RewriteBase     /
# these are the rewrite conditions
RewriteCond     %{REQUEST_FILENAME}     !-f
RewriteCond     %{REQUEST_FILENAME}     !-d
# and finally, the rewrite rules
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$   /pages.php?which_page=$1&data1=$2 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]

这非常适合将所有请求重定向到我的 CMS 的 pages.php 脚本。

问题是,在极少数情况下,我有一个客户想要添加一个子目录,他们可以在其中添加无限的附加子目录,所有这些子目录都需要重定向到其中的 index.html。对于这个讨论,让我们将此主要子目录称为 main-dir,当用户访问www.mysite.com/main-dir时应将其重定向到www.mysite.com/main-dir/index.html

如果客户端在 main-dir 中添加更多目录,则方向应指向其中的 index.html 例如www.mysite.com/main-dir/some-dir/index.html

所以基本上我需要从常规 pages.php 重定向中排除 main-dir 及其任何子目录,并确保它们都重定向到index.html其中。

我已经尝试了很多方法来实现这一点,包括在子目录中添加一个 .htaccess 文件 onlyRewriteEngine off并添加各种条件和规则,例如:

RewriteCond %{REQUEST_URI} !^/collections/^

RewriteRule ^(collections)/$1 [L]

没有任何效果。

目前,如果网络用户访问,www.mysite.com/main-dir他们将被重定向到 pages.php 脚本并且不会被豁免,尽管如果他们访问,www.mysite.com/main-dir/index.html他们确实会访问 html 页面。

任何援助将不胜感激。

4

2 回答 2

3

您必须像这样在每个 RewriteRule 中使用负前瞻:

# ignore all rules if URI starts with /main-dir/
RewriteRule ^main-dir/  - [L,NC]

RewriteRule ^([\w\s+-]+)/?$ pages.php?which_page=$1 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]

这将使上述规则适用于 /main-dir/.

同样对于在index.html内部服务,/main-dir/您不需要做任何事情,因为这在 Apache 中默认显示。

于 2012-01-11T18:53:47.653 回答
0

只需将以下内容添加到 htaccess 的顶部。这将防止 url 被重写为 pages.php 是 url 的第一部分是根目录中的现有目录。因此,如果名称为 xxx 的目录存在,example.com/xxx/whatever/ 将不会被重写。

RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^([^/]+)(/(.*))?$ - [L]

您的 RewriteCond 看起来不错,但您必须在每个 RewriteRule 前面重复它。其他两个 (... !-d... !-f) 也是如此。但我会建议我在下面使用的方式,这样你就不必一遍又一遍地重复它们。

最后你的 htaccess 应该是这样的:

# this is the initialization
Options         +FollowSymLinks
RewriteEngine   On
RewriteBase     /
# don't rewrite if any of these conditions 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* - [L]

RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^([^/]+)(/(.*))?$ - [L]


# Rewrite all other matching urls to pages.php

#leave old rewrite rules (without the conditions) here, or use the much sorter version I would suggest.
RewriteRule     ^([^/]+)(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]

#old rules
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$   /pages.php?which_page=$1&data1=$2 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]
于 2012-01-11T19:26:44.887 回答