【问题标题】:.htaccess for subfolder.htaccess 子文件夹
【发布时间】:2012-01-10 15:09:29
【问题描述】:

我有以下结构

-www
  \-subfolder

www 我有我的主站点index.php

在子文件夹中,我有一个管理 UI,我想在其中有另一个 index.php 用于管理 UI。

目前我来自/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]

你能帮帮我吗?我在其他答案中尝试了几个选项,但由于我不是一个高级的网络开发人员,所以我无法工作。


@TerryE,对不起,如果我说得太粗鲁了。

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

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

我有站点本地化,因此 URL 构造为 /$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']) 为主页提供/en/home

127.0.0.1/en/home 工作

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

但是,我创建了一个管理 UI,它位于文件夹 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

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

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

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    据此我假设您的 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 文件设置 RewriteEngine On。因此,如果您在“子文件夹”子文件夹中添加一个特定于管理员的 .htaccess 文件,这将抢占 www 文件并规避此问题。

    后记 cmets

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

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

    关于具体点:

    • 如果你的结构是/(lang|admin)/page,那你为什么有这个规则,因为它会导致 perdir 重试造成严重破坏。

      RewriteRule ^$ index.php [QSA,L]
      
    • 更好的方法是强制重定向到默认语言(假设语言列表在此示例中为 EN 和 IT:

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

    我是 Stackoverflow 的新手,但不是整理出这种垃圾。我的博客上有几篇关于这方面的详细文章。

    Postscript cmets -- 还有更多

    确定一些一般性帮助。

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

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

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

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

    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]
    

    【讨论】:

    • 感谢您的回答。您的假设是正确的,我的 www 文件夹中只有一个 htaccess 文件。那么我的子文件夹中的 htcaccess 文件中的内容应该是什么?
    • @Veni,perdir 处理将选择 subfolder/.htaccess 文件(如果存在)并打开 RewriteEngine。如果您不进行任何重写,那么您就不需要任何重写。这只是意味着不为子文件夹 URI 处理根访问文件
    • 我的主站点的 url 结构是 domainname.com/lang/page E.g. www.domainname.com/en/home;管理 UI 的结构是 domainname.com/subfolder/page。我似乎没有让它工作。显然我错过了一些东西。你能帮我进一步吗?谢谢!
    • 感谢您分享您的哲学观点,但不幸的是,您并没有真正提供帮助……您所写的内容让我更加困惑。我在一个我不是专家的领域有一个特定的问题,需要一个解决方案。无论如何,谢谢。
    • @Veni,您需要具体的帮助,但正在提供您问题的一般化版本。我想帮忙,但我不是千里眼。给我一个有效的和无效的特定 URI。还有很明显的东西:Apache 是否以与您的应用程序文件不同的 UID 运行。如果是这样,您是否在您的目录/文件/.htaccess 上设置了世界权限,以便 Apache 看到它们?
    【解决方案2】:
    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]
    

    【讨论】:

    • 我使用了您在 www 文件夹中的 .htaccess 中建议的内容,现在链接不会指向主站点,而是我在子文件夹中单击的任何链接,例如domainname.com/subfolder/page 给我 HTTP 404 NOT Found。子文件夹是否需要单独的 htaccess?
    【解决方案3】:

    您可以通过以下更改防止对您的子文件夹的请求被重写

    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]
    

    【讨论】:

    • 子文件夹没有被重写,但我得到 HTTP 404 Not found 异常。我的链接被构造为 /subfolder/page 并且在子文件夹 index.php 中包含包含“html/”。 $apage.'.php'; html 文件夹在子文件夹内的位置。感谢您的帮助!
    猜你喜欢
    • 2012-09-14
    • 2014-06-23
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多