Apache .htaccess用于子文件夹

Apache .htaccess用于子文件夹,apache,.htaccess,Apache,.htaccess,我有以下结构 -www \-subfolder 在www中,我有我的主站点index.php 在子文件夹中,我有一种管理UI,在那里我想为管理UI提供另一个index.php 目前,来自/subfolder/index.php的请求被重定向到www/index.php,基本上我的管理UI页面不会显示 这是我的.htaccess文件: RewriteEngine On RewriteRule ^$ index.php [QSA,L] RewriteCond %{REQUEST_FILENAM

我有以下结构

-www
  \-subfolder
www
中,我有我的主站点
index.php

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

目前,来自
/subfolder/index.php
的请求被重定向到
www/index.php
,基本上我的管理UI页面不会显示

这是我的
.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服务器,它为我提供了在Windows7操作系统上运行的Apache服务器。服务器安装在Program files\VertrigoServ\Apache文件夹中

我的公用文件夹是www。在那里我有我的主要网站定义。通过
127.0.0.1/index.php
127.0.0.1/

我进行了站点本地化,因此URL被构造为
/$lang/$page
,例如

在主站点的
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/

$\u服务器['REQUEST\u URI'])
为主页提供
/en/home

127.0.0.1/en/home

所有的导航都能在主站点上完美运行。 然而,我已经创建了一个管理用户界面,它位于文件夹www/admin中,在www

在那里我没有任何本地化。我只是把英语作为语言。 因此,在admin文件夹中index.php的顶部,我再次看到了

$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );
但是,这里的导航如下所示

在此基础上,我将在admin文件夹中的index.php中构建页面,如下所示:

include 'html/ . $page . '.php';
页面位于
www/admin/html

这根本不起作用。每当我在管理界面中按下主页链接,我就会被重定向到我的主站点(不存在的页面)。如果我在.htaccess中添加
RewriteRule^子文件夹/-[L]
,我会得到
htp404notfound错误


127.0.0.1/admin/home
不工作。管理员中的任何其他导航也不可用。谢谢你愿意和耐心帮助我

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

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]

根据这一点,我假设您的www目录中只有一个.htaccess文件

想想规则是什么

RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
当从www在Perdir上下文中进行解释时是否执行:获取任何形式为
someDir/somePage
的URI,并将其替换为
index.php?lang=someDir&page=somePage
,因此这将截取并重写任何
/subfolder/index.php

这没有很好的文档记录,但Perdir处理将优先使用请求路径上最低的.htaccess文件设置
重写引擎。因此,如果在“subfolder”子文件夹中添加一个特定于管理员的.htaccess文件,这将抢占www文件并避免此问题

附言评论 当真正的问题是“如果我的网站由共享服务托管,我该如何调试我的.htaccess规则?”时,Veni和其他海报会进入问答环节我添加共享服务资格的原因是,如果您具有LAMP配置的root访问权限,那么您可以打开重写日志记录,并且调试级别为4-6的日志文件将为您提供足够的取证,以确定发生了什么

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

关于具体问题:

  • 如果您的结构是
    /(lang | admin)/page
    ,那么为什么要使用此规则,因为它会对perdir重试造成严重破坏

    RewriteRule ^$ index.php [QSA,L]
    
  • 最好使用以下方法强制重定向到默认语言(假设lang列表为EN,在本例中为:

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond $1 !^/(en|it|admin)/
    RewriteRule ^(.*) http://yourdomain/en/$1 [R=301,L]
    
  • 您是否知道重定向重新启动/循环问题?(搜索重定向状态)

我对Stackoverflow还不熟悉,但不会整理这种s**t。我的博客上有几篇关于这方面的详细文章

Postscript注释--还有更多 好的,一般的帮助

  • 不要在windows\system32\drivers\etc\hosts中放置127.0.0.1的别名
  • 您可以在VertrigoServ Apache配置中打开重写日志,这将为您提供问题所在的详细审计
  • 如果您有一个小的诊断存根来帮助您了解发生了什么,那么它也会有所帮助,这就是我在测试目录中为index.php提出的建议:

    <?php header( "Content-type: text.plain" ); echo "main: "; var_export($_GET);
    

    子文件夹未被重写,但我收到HTTP 404未发现异常。我的链接被构造为/subfolder/page,在subfolder index.php中,我包含了“html/”.$apage..php”;其中html文件夹位于子文件夹内。我感谢您的帮助!感谢您的回答。您的假设是正确的,我只有一个htaccess我的www文件夹中的文件。那么我的子文件夹中的htcaccess文件的内容应该是什么呢?@Veni,perdir处理将选择
    子文件夹/.htaccess
    文件(如果它存在)并启用“重写引擎”。如果不需要进行重写,则不需要任何内容。这只意味着根访问文件不会被处理
    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]
    
    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]