Apache mod\u在子目录中重写

Apache mod\u在子目录中重写,apache,mod-rewrite,Apache,Mod Rewrite,我们的web服务器的结构如下 /path-to-docdir [Contains main pages] ./app/ [Some application not directly related to the main content] 主页上的内容很好。在app目录中,我试图使用mod_rewrite将所有页面重定向到公共目录中的index.php <IfModule mod_rewrite.c> RewriteEngine On Re

我们的web服务器的结构如下

/path-to-docdir     [Contains main pages]
        ./app/      [Some application not directly related to the main content]
主页上的内容很好。在app目录中,我试图使用mod_rewrite将所有页面重定向到公共目录中的
index.php

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

/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
前端控制器依赖于
请求URI
字符串的最后两个组件来解释控制器和操作

为了完成上述操作,我在
app
目录中创建了以下
.htaccess
文件

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^$     public/   [L]
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
这似乎没有什么区别。我还应该注意,如果我将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] [perdir/path to docdir/app/]使用/app/public/public/public/public/public/public/public/public/public/start/login/[内部重定向] 我真的不知道从哪里开始看这一点,所以任何帮助或指点我进一步将不胜感激

编辑:

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

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

重新启动发动机
重写cond%{SCRIPT_FILENAME}-F
重写cond%{SCRIPT_FILENAME}-D
重写规则^(.*)$public/index.php?$1[L]
有几点:

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]

非常感谢您的回复。是的,我确实需要一个重写条件。是的,你是对的,第一条规则是多余的。我已经编辑了我的答案。虽然解决方案没有完全起作用。我确实觉得它很有用,但很抱歉我没有足够的分数来投票。没问题。如果您希望自己的答案为“已接受”答案,您可以自己将其作为答案发布,而不是对问题进行编辑,然后将其标记为已接受。