如何递归地为子目录写htaccess重写?

时间:2013-04-27 05:24:28

标签: .htaccess mod-rewrite url-rewriting rewrite subdirectory

我有一台Apache服务器,为我的公司托管了许多网站。我计划使用htaccess,并将“root”目录中的URL重写为子文件夹。

这是我真正的文件夹结构:

  • / www(root)
  • / www / beamstyle(beamstyle.com.hk,CodeIgniter framework)
  • / www / beamcard(beamcard.com.hk,静态文件)
  • / www / beamcard / app(beamcard.com.hk / app,CodeIgniter framework)

=============================================== =====================

beamstyle网站使用以下代码:

ReWriteCond %{HTTP_HOST} ^(www.)?beamstyle.com.hk [NC]
RewriteCond %{REQUEST_URI} !^/beamstyle/.*$
RewriteRule ^(.*)$ /beamstyle/$1 [L]

以上是有效的,因为我的框架(CodeIgniter)位于/ www / beamstyle内。

因此,我可以访问http://beamstyle.com.hk,它会被重定向而不会出现任何问题。

=============================================== =====================

然而,这是问题所在。当我做beamcard网站时,它不起作用,因为实际上,目录“/ www / beamcard /”实际上只存储静态.html文件。我的CodeIgniter框架在app /.

当我使用相同的代码时:

ReWriteCond %{HTTP_HOST} ^(www.)?beamcard.com.hk [NC]
RewriteCond %{REQUEST_URI} !^/beamcard/.*$
RewriteRule ^(.*)$ /beamcard/$1 [L]

以下是使用上述代码的结果:

(a)http://beamcard.com.hk/< - 确定没问题,因为这是重写后的直接文件夹(仅包含静态文件)

(b)http://beamcard.com.hk/app< - 不行,因为它在重写后会将一个目录放在直接文件夹之外。

  • 如果我输入此内容,位置栏(位于顶部)将被取消伪装并重定向到http://beamcard.com.hk/beamcard/app/(我确认此重定向不是由Codeigniter文件完成的,因为当我申请空时会发生相同的结果目录)

=============================================== =====================

我已尽力而为,并进行了如此多的Google搜索,但未能在重写后对目录下的子目录工作的htaccess代码段进行细化。当我进一步进入子目录时,它就失去了它的“伪装”功能。

非常感谢任何帮助!

干杯, 托马斯

=============================================== =====================

更新1

为了更好地描述我的情况,我整理了一些用例。

[案例情景]

**为简化起见,我们假设“app”目录为空**

(1)如果我输入http://beamcard.com.hk,服务器内的页面“/www/beamcard/index.html”应该被加载。完成加载页面后,位置栏应写入“http://beamcard.com.hk/”。

(2)如果我输入http://beamcard.com.hk/contact_us.html,服务器内的页面“/www/beamcard/contact_us.html”应该被加载。完成加载页面后,位置栏应写入“http://beamcard.com.hk/contact_us.html”。

(3)如果我输入http://beamcard.com.hk/app,则应加载“空文件列表”。完成加载页面后,位置栏应写入“http://beamcard.com.hk/app/”。

(4)如果我输入http://beamcard.com.hk/app/,则应加载“空文件列表”。完成加载页面后,位置栏应写入“http://beamcard.com.hk/app/”。

=============================================== =========================

目前,(1)和(2)有效。

但是,对于(3)和(4),在完成加载页面后,位置栏被重定向到“http://beamcard.com.hk/beamcard/app/”,“显示”“/ beamcard /”部分,理想情况下应该是隐藏在网站访问者之外。

1 个答案:

答案 0 :(得分:0)

尝试在最后添加NS(以防止将规则应用于子请求):

ReWriteCond %{HTTP_HOST} ^(www.)?beamcard.com.hk [NC]
RewriteCond %{REQUEST_URI} !^/beamcard/.*$
RewriteRule ^(.*)$ /beamcard/$1 [L,NS]