mod_rewrite在一个子目录中

时间:2012-06-21 17:12:47

标签: apache mod-rewrite

我们的网络服务器结构如下

/path-to-docdir     [Contains main pages]
        ./app/      [Some application not directly related to the main content]

主页服务很好。在app目录中,我尝试使用mod_rewrite将所有页面重定向到公共目录中的index.php

请求

/server/app/start/login/ => /server/app/public/index.php 
/server/app/start/login  => /server/app/public/index.php
/server/app/start/login?name=someone => /server/app/public/index.php?name=someone

前端控制器依赖REQUEST_URI字符串的最后两个组件来解释控制器和操作。

为了做到这一点,我在.htaccess目录中创建了以下app文件

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^$     public/   [L]
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

在这里,我发现服务器进入上述URL的重定向循环。我尝试用$1替换index.php,这确实会打开页面,但页面内部对脚本文件的引用会出错。

经过一番搜索后,我添加了以下内容:

RewriteBase /app/

这似乎没有任何区别。我还应该注意,如果我将app目录作为服务器根目录,一切都按预期工作。

我还打开了调试日志记录,我可以从中收集的是服务器确实进入了重定向循环。

[perdir /path-to-docdir/app/] internal redirect with /app/public/public/public/public/public/public/public/public/public/public/public/start/login/ [INTERNAL REDIRECT]

我不确定从哪里开始关注这一点,所以任何有助于我进一步发展的帮助或指示都会非常感激。

编辑:

这个htaccess文件对我有用 - 如果其他人正在寻找解决方案。显然,我错过了重写条件

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ public/index.php?$1 [L]
</IfModule>

1 个答案:

答案 0 :(得分:4)

几点:

RewriteBase路径不需要尾部斜杠,因此RewriteBase /app/应为RewriteBase /app

RewriteRule ^(.*)$ public/$1使RewriteRule ^$ public/变得多余。前者将匹配http://yourserver/app并在内部重写为http://yourserver/app/public,因此不需要后者。

最后,尝试添加重写条件:

RewriteEngine On
RewriteBase /app
RewriteCond %{REQUEST_URI} !^/app/public/
RewriteRule ^(.*)$ public/$1 [L]