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]