4

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

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

主要页面服务良好。在应用程序目录中,我尝试使用 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 的重定向循环。我尝试替换$1index.php并且确实打开了页面,但是页面内对脚本文件的内部引用遇到了错误。

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

RewriteBase /app/

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

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

[perdir /path-to-docdir/app/] 内部重定向 /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

1 回答 1

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]
于 2012-06-21T21:17:33.177 回答