我们的网络服务器结构如下
/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>
答案 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]