htaccess重写两个目录

时间:2014-04-24 22:28:07

标签: php apache .htaccess mod-rewrite

我正在尝试使用重写规则来访问两个目录。我抓住并测试了很多来自在线和其他SO帖子的代码,但我最终得到的仍然无法正常工作。这就是我要做的事情:

1)如果页面请求是针对/ home,/ test,/ 404,/ etc,则从/ app目录加载文件并遍历如下:/ home,/ news / topics / post,/ contact /,/博客/类别/日期/后

2)如果页面请求仅适用于/ admin,则从/ admin目录加载文件并能够遍历如下:/ admin或/ dashboard,/ admin / page / edit,/ admin / page /删除,/ admin / page / create,/ admin / section / delete /

发生了什么事? 如果我去/家或只是/,工作得很好!但如果我到/ test,/ contact,/ admin,/ etc我得到一个404文件未找到

文件结构(虽然可以更改):

/admin
 --dashboard.php

/app
 --index.php

.favicon.png
.favicon.ico
.htaccess

我开始认为像这样对重写进行硬编码可能会更好:

RewriteRule ^home$ /atlas.php [NC,L]
RewriteRule ^admin$ /admin/dashboard.php [NC,L]

......但我想在我放弃这个社区之前,我是否能够帮助SO社区。

有什么建议吗?

我目前的代码:

Options -Indexes
Options -MultiViews
Options +FollowSymLinks


# Set the default site page
DirectoryIndex /app/index.php home


# Rewrite Rules and Conditions
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /

# Remove www
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L,NC]


# Assets are in /app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.(gif|jpg|png|jpeg|css|js|svg|swf)$ /app/$1.$2 [L,NC]


# First, check if request is to site pages, which is in /app/
RewriteCond %{DOCUMENT_ROOT}/app%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/app%{REQUEST_URI} -d
RewriteRule ^(.*)$ /app/index.php?/$1 [NC,L]


# Second, check if request is to /admin, which is in /admin/
RewriteCond %{DOCUMENT_ROOT}/admin%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/admin%{REQUEST_URI} -d
RewriteRule ^(.*)$ /admin/dashboard.php?/$1 [NC,L]


# Default to /app
RewriteCond ${REQUEST_URI} !^/app/
RewriteRule ^(\w+)$ /app/$1 [L]

</IfModule>

1 个答案:

答案 0 :(得分:0)

我认为你可以做到:

#admin
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/admin(.*)$ /admin_handler.php?path=$1 [QSA]

#app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ /app_handler.php?path=$1 [QSA]

如果您的所有网址都需要/app,为什么不将/app放入其中?在重写中添加它是毫无意义的。

当你重写它时,有一个单一入口点非常棒,因为你只需要重写该文件的所有内容并让PHP处理它。弄清楚PHP中的请求比mod_rewrite更容易。此设置现在有两个入口点,一个用于访问者,一个用于管理员,但您甚至可以将它们合并为一个。