又一个Apache的mod_rewrite击败了家伙

时间:2013-06-30 16:38:29

标签: apache .htaccess mod-rewrite

我认为我不能理解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

提前致谢。

1 个答案:

答案 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