2012-06-21 96 views
4

我们的网络服务器如下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。我试着用index.php代替$1,并且确实会显示页面,但是页面内部对脚本文件的引用会导致错误。

经过一番搜索左右,我添加了以下行:

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> 

回答

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] 
+0

您的答复非常感谢。是的,我确实需要重写条件。是的,你是对的,第一条规则是多余的。我编辑了我的答案。 – sumansudha

+0

好的,如果您发现这个有用,请立即/接受 – megaflop

+0

虽然解决方案并没有完全起作用。我确实觉得它很有用,但我很抱歉我没有足够的积分来点赞。 – sumansudha