.htaccess for子文件夹

时间:2012-01-10 15:09:29

标签: apache .htaccess

我有以下结构

-www
  \-subfolder

www我的主网站index.php

在子文件夹中,我有一种管理员用户界面,在那里我想为管理员界面提供另一个index.php

目前我在/subfolder/index.php内的请求被重定向到www/index.php,基本上我的管理员界面的页面都没有显示。

这是我的.htaccess文件:

RewriteEngine On
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
你能帮帮我吗?我在其他答案中尝试了几个选项,但由于我不是一个非常先进的Web开发人员,我无法工作。


@TerryE,对不起,如果我是粗暴的。

我正在使用本地设置进行测试。 我已经安装了Vertrigo服务器,它给了我Apache server.Running在Windows7操作系统上。服务器安装在Program files \ VertrigoServ \ Apache文件夹中。

我的公共文件夹是www。在那里,我有我的主要网站定义。 。该网站可通过127.0.0.1/index.php127.0.0.1/

在本地访问

我有网站本地化,因此网址构建为/$lang/$page,例如<a href=" / <?php echo $lang; ?> / home "> HOME </a>

index.php主站点中,我有以下内容:

$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );

$lang = trim( ( isset( $_GET[ 'lang' ] ) ? $_GET[ 'lang' ] : 'en' ), '/' );
$langs = array( 'en', 'fr', 'ru' ); 

根据这些数据,我可以这样打开页面:

include 'html/'. $lang . '/' . $page . '.php';

我所有主要网站的页面都在www/html/$lang/

$_SERVER['REQUEST_URI'])为页面HOME提供了/en/home

127.0.0.1/en/home工作

所有导航都适用于主站点。

但是我创建了一个管理员用户界面,位于www / admin文件夹中 - 位于www。

在那里,我没有任何本地化。我只是把EN作为语言。 所以在admin文件夹的index.php顶部我再次

$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );

但是,此处导航如下<a href=/admin/home"> HOME </a>

然后我将在admin文件夹中的index.php中构建页面,如下所示:

include 'html/ . $page . '.php';

页面位于www/admin/html

这根本不起作用。每当我在管理界面中按主页链接时,我都会被重定向到我的主站点(不存在的页面)。如果我在.htaccess中添加RewriteRule ^subfolder/ - [L],我会获得HTTP 404 NOT Found error

127.0.0.1/admin/home不工作。在管理员中也没有任何其他导航。感谢您愿意和耐心帮助我!

3 个答案:

答案 0 :(得分:9)

我假设您在 www 目录中只有一个 .htaccess 文件。

考虑一下规则

RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]

www 的Perdir上下文中进行解释时:执行someDir/somePage形式的任何URI并将其替换为index.php?lang=someDir&page=somePage,这样就会拦截并重写任何/subfolder/index.php RewriteEngine On 1}}。

这没有详细记录,但Perdir处理将优先使用请求路径上的最低 .htaccess 文件设置/(lang|admin)/page。因此,如果您在“子文件夹”子文件夹中添加管理员特定的 .htaccess 文件,则会抢占 www ,并避免此问题。

后记评论

当真正的问题是“如果我的网站由共享服务托管我如何调试我的.htaccess规则”之一时,Veni和其他海报都会进入问答环节。我添加共享服务限定的原因是,如果您具有对LAMP配置的root访问权限,那么您可以启用重写日志记录,并且调试级别为4-6的日志文件将为您提供足够的取证来计算正在进行的操作

然而,大多数业余/小型服务用户在共享的基础上购买他们的服务,在这里他们没有root访问权限,托管服务提供商出于性能原因禁用此类日志记录,因此他们有二进制反馈 - 规则工作或他们没有。我使用共享服务,我的方法(描述here)是建立一个镜像这个配置作为测试和集成环境的VM - 在这里我有这样的root访问权限。但是,对于大多数用户来说,这可能太复杂了。这确实是一个更广泛的主题,值得进行自己的Q /讨论。

具体要点:

  • 如果您的结构是RewriteRule ^$ index.php [QSA,L] ,那么为什么您有此规则,因为它可能会对perdir重试造成严重破坏。

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond $1 !^/(en|it|admin)/
    RewriteRule ^(.*) http://yourdomain/en/$1 [R=301,L]
    
  • 如下所示强制重定向到默认语言(假设在此示例中,lan​​g列表为EN和IT:

    <?php header( "Content-type: text.plain" ); echo "main: "; var_export($_GET);
    
  • 您是否了解重定向重启/循环问题? (搜索REDIRECT_STATUS)

我是Stackoverflow的新手,但不是为了解决这种问题。我的博客上有几篇详细的文章。

后记评论 - 更多

确定一些一般帮助。

  • 请不要我们修复IP在您的windows \ system32 \ drivers \ etc \ hosts
  • 中为127.0.0.1添加别名
  • 您可以在VertrigoServ Apache配置中打开重写日志记录,这可以让您详细了解遇到问题的地方
  • 如果您有一个小诊断存根来帮助您了解正在发生的事情,这也有帮助,这就是我在测试目录中为index.php提出的:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -f                [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .  -                                  [L]
    
    RewriteRule ^$ index.php                          [QSA,L]
    RewriteRule ^admin/?$ admin/index.php             [QSA,L]
    
    RewriteRule ^admin/(.*)$ admin/index.php?page=$1  [L]
    
    RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
    
    RewriteRule ^(.*)$ index.php?lang=en&page=$1      [L]
    

但是您确实需要以下每种情况:   - 处理URI存在(并停止重写循环)   - /和/ admin /的默认值   - admin / *   - * / *   - *(和语言默认值)

这就是我提出的。我保持简单。我们可以使用复杂的regexp来折叠其中一些,但为什么要这么麻烦。如果需要,您可能需要添加更多QSA。

{{1}}

答案 1 :(得分:3)

RewriteEngine On

RewriteRule ^$ index.php [QSA,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^subfolder/(.*)$ subfolder/index.php?page=$2 [L]

RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]

答案 2 :(得分:-1)

您可以阻止使用下面的更改重写对子文件夹的请求

RewriteEngine On
RewriteRule ^$ index.php [QSA,L]

#prevent requests to your subfolder from being rewritten
RewriteCond %{REQUEST_URI} !^/subfolder/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]