我认为我不能理解mod_rewrite
是如何运作的。理论上我认为我得到了它,但似乎无法使这项工作。我有以下文件结构:
code
-application/
-bundles/
-laravel/
-public/
-css/
-js/
-img/
-index.php
-storage/
-.htaccess
可悲的是,我的httpd.conf
VHost配置包含:
<Directory path/to/code>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
DocumentRoot path/to/code
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
我无法将其修改为指向代码/ public /所以我认为我可以使用.htaccess
修复它。现在我已经尝试了一切。基本上我想做的是将每个请求转换为/public/index.php/($1)
,css, js, img
除外,/public/css/($1)
/public/img/($1)
/public/js/($1)
应转换为:{/ p>
example.com/
因此,如果我有example.com/public/index.php
,则会更改为example.com/public/css
,而他们的css,img,js等会更改为.htaccess
,img,js。
我不能这样做 :(
我的<IfModule rewrite_module>
RewriteEngine on
RewriteRule ^(.*)$ /public/index.php/$1
</IfModule>
采取了多种形式,最近我放弃了所有内容,只是看起来像这样:
.htaccess
当然,这给我 500内部服务器错误,因为它会导致重写循环(对我来说不是很清楚,但仍然是这样)
所以,我对<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/css
RewriteRule ^css/(.*)$ /public/css/$1
RewriteCond %{REQUEST_URI} ^/img
RewriteRule ^img/(.*)$ /public/img/$1
RewriteCond %{REQUEST_URI} ^/js
RewriteRule ^js/(.*)$ /public/js/$1
RewriteRule ^(.*)$ /public/index.php/$1
</IfModule>
的想法是(伪代码):
mod_rewrite
知道我怎么能做到这一点?我想了解一下我做错了什么。我很想知道如何撰写好.htaccess
{{1}}个文件。
我使用的是Windows 7,Apache2.2
提前致谢。
答案 0 :(得分:1)
您将获得无限循环,因为每个重写的路径仍必须通过顶部的httpd.conf和.htaccess指令返回。通常建议使用L
标志,但这只是告诉Apache停止当前运行;它不会阻止完成的重写路径必须通过顶部的指令。
如果你想重写为“/ public”,你需要添加一个RewriteCond来检查这个重写是否还没有完成,否则每次都会发生重写并发生无限循环。
这应该适用于“公共”改写:
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule (.*) /public/$1
这表示“如果请求的路径尚未以/public/
开头,则默认重写请求以/public/
为其添加。
您尝试处理外围文件请求(CSS,图像等)并不是很清楚。如果您希望/public/page.css
成为/public/css/page.css
请求,则应执行以下操作:
RewriteRule ^public/([^/]+)\.css$ /public/css/$1.css
然而,我没有看到这样做的好处。我认为最好更新页面脚本或静态HTML页面,只需更改它们以反映要用于CSS和图像文件的新路径结构。使用mod_rewrite来避免更新页面中的路径是一个坏主意(以我的拙见),会导致服务器负载加重,请求响应变慢。
如果您想了解有关mod_rewrite的更多详细信息,请参阅Apache mod_rewrite manual page。