.htaccess for子文件夹

Ven*_*eni 4 apache .htaccess

我有以下结构

-www
  \-subfolder
Run Code Online (Sandbox Code Playgroud)

www我有我的主要网站index.php.

在子文件夹中我有一种管理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]
Run Code Online (Sandbox Code Playgroud)

你能帮助我吗?我在其他答案中尝试了几个选项,但由于我不是一个非常先进的Web开发人员,我无法工作.


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

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

我的公共文件夹是www.在那里,我有我的主要网站定义..该网站通过127.0.0.1/index.php或本地访问127.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' ); 
Run Code Online (Sandbox Code Playgroud)

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

include 'html/'. $lang . '/' . $page . '.php';
Run Code Online (Sandbox Code Playgroud)

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

$_SERVER['REQUEST_URI'])给出/en/home页面HOME.

127.0.0.1/en/home 作品

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

但是我创建了一个管理UI,它位于www/admin文件夹中 - 位于www下面的一个级别.

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

$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );
Run Code Online (Sandbox Code Playgroud)

但是,这里的导航如下 <a href=/admin/home"> HOME </a>

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

include 'html/ . $page . '.php';
Run Code Online (Sandbox Code Playgroud)

页面在于 www/admin/html

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

127.0.0.1/admin/home什么都不行.在管理员中也没有任何其他导航.感谢您愿意和耐心帮助我!

Ter*_*ryE 9

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

想想这个规则

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

当从Perdir上下文中解释时从www:获取表单的任何URI someDir/somePage并替换它index.php?lang=someDir&page=somePage,因此这将拦截并重写任何/subfolder/index.php.

这没有详细记录,但Perdir处理将优先使用请求路径上的最低.htaccess文件设置RewriteEngine On.因此,如果您在"子文件夹"子文件夹中添加一个特定于管理员的.htaccess文件,这将抢占www一并解决此问题.

后记评论

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

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

具体点:

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

    RewriteRule ^$ index.php [QSA,L]
    
    Run Code Online (Sandbox Code Playgroud)
  • 更好的类似下面的内容强制重定向到默认语言(假设在这个示例中,lan​​g列表是EN和IT:

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond $1 !^/(en|it|admin)/
    RewriteRule ^(.*) http://yourdomain/en/$1 [R=301,L]
    
    Run Code Online (Sandbox Code Playgroud)
  • 您是否了解重定向重启/循环问题?(搜索REDIRECT_STATUS)

我是Stackoverflow的新手,但不是为了解决这种问题.我在我的博客上有一些详细的文章.

后记评论 - 还有更多

好一些一般的帮助.

  • 不要我们修复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);
    
    Run Code Online (Sandbox Code Playgroud)

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

这就是我想出来的.我保持简单.我们可以使用复杂的regexp来折叠其中一些,但为什么要这么麻烦.如果需要,您可能需要添加更多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]
Run Code Online (Sandbox Code Playgroud)