.htaccess将URL的一部分重定向到本地文件

时间:2013-09-27 07:50:36

标签: php apache .htaccess mod-rewrite redirect

我有一个自定义Web应用程序,文件结构如下:

/apps/calendar/frontend/index.php
/apps/calendar/frontend/view/index.php
/apps/calendar/backend/index.php
/apps/calendar/backend/edit/index.php
/apps/calendar/backend/add/index.php
/apps/calendar/backend/view/index.php

我正在尝试编写一个.htaccess文件来帮助重定向文件,这样他们就无法看到“真正的”路径。

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/admin
RewriteRule ^([^/\.]+)/(.*)/(.*)($|/$) /apps/$1/frontend/$2/$3 [NC,L]
RewriteRule ^([^/\.]+)/(.*)($|/$) /apps/$1/frontend/$2 [NC,L]
RewriteRule ^([^/\.]+)($|/$) /apps/$1/frontend/ [NC,L]

当我访问localhost / calendar时,它应该将重定向映射到/apps/calendar/frontend/index.php。但是当我访问localhost / calendar / add时,它会给我301(永久移动),然后在控制台中显示localhost / apps / calendar / frontend / add / index.php的完整页面。有人知道为什么会这样吗?或者更好的解决方法?应用程序可能有很多子目录,因此,我并不是特别热衷于为子目录组合制定规则。

正如您所看到的,我还有一个/ admin路径,它会加载应用程序的/ backend /部分。我会假设我可以使用/ admin?

的前缀来执行类似的代码

1 个答案:

答案 0 :(得分:3)

这个问题也可能对您有用:Create blog post links similar to a folder structure.

鉴于您的.htaccess位于您的域/home/youraccount/public_html/.htaccess的根文件夹中,它将如下所示:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !^/(admin|apps) [NC]
RewriteCond %{DOCUMENT_ROOT}/apps/$1 -d
RewriteRule ^([^/]+)/?(|.*)$ /apps/$1/frontend/$2 [NC,L]

RewriteCond %{REQUEST_URI} !^/apps [NC]
RewriteCond %{DOCUMENT_ROOT}/apps/$1 -d
RewriteRule ^admin/([^/]+)/?(|.*)$ /apps/$1/backend/$2 [NC,L]

让我们说用户访问:

http://domain.com/calendar
http://domain.com/calendar/
http://domain.com/calendar/add

以上所有内容都会重定向到

/apps/calendar/frontend/index.php
/apps/calendar/frontend/index.php/
/apps/calendar/frontend/index.php/add

如果用户访问:

http://domain.com/calendar/admin
http://domain.com/calendar/admin/
http://domain.com/calendar/admin/add

它会转到:

/apps/calendar/backend/index.php
/apps/calendar/backend/index.php/
/apps/calendar/backend/index.php/add

因此,对于每一端都会使index.php成为你的控制器:

/apps/calendar/frontend/index.php
/apps/calendar/backend/index.php