Apache mod\u在子目录中重写
我们的web服务器的结构如下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
/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]
非常感谢您的回复。是的,我确实需要一个重写条件。是的,你是对的,第一条规则是多余的。我已经编辑了我的答案。虽然解决方案没有完全起作用。我确实觉得它很有用,但很抱歉我没有足够的分数来投票。没问题。如果您希望自己的答案为“已接受”答案,您可以自己将其作为答案发布,而不是对问题进行编辑,然后将其标记为已接受。