我有以下结构
-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.php
或127.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
不工作。在管理员中也没有任何其他导航。感谢您愿意和耐心帮助我!
答案 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 ,并避免此问题。
然而,大多数业余/小型服务用户在共享的基础上购买他们的服务,在这里他们没有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]
如下所示强制重定向到默认语言(假设在此示例中,lang列表为EN和IT:
<?php header( "Content-type: text.plain" ); echo "main: "; var_export($_GET);
您是否了解重定向重启/循环问题? (搜索REDIRECT_STATUS)
我是Stackoverflow的新手,但不是为了解决这种问题。我的博客上有几篇详细的文章。
确定一些一般帮助。
如果您有一个小诊断存根来帮助您了解正在发生的事情,这也有帮助,这就是我在测试目录中为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]