.htaccess中的mod_rewrite规则

时间:2013-02-01 10:13:57

标签: apache .htaccess

我想在我的.htaccess文件中使用重写规则更改我的文档根目录,并将所有请求重定向到index.php,静态资源除外

换句话说:

  1. 如果存在前缀为www的路径的文件(即www/{%request_uri}): http://domain.com/css/main.css应改写为http://domain.com/www/css/main.css

  2. 如果该文件不存在,请重定向到应用主入口点www/index.php: e.g。

    http://domain.com应改写为http://domain.com/www/index.php

    http://domain.com/hello应改写为http://domain.com/www/index.php/hello

    http://domain.com/hello?a=1应改写为http://domain.com/www/index.php/hello?a=1

  3. 我尝试了各种变体,但要么它给我们500个内部服务器错误,要么无限循环。这是一个给出500内部服务器错误的文件:

    # try to find it in www/
    RewriteCond {%DOCUMENT_ROOT}/www%{REQUEST_URI} -f
    RewriteCond {%DOCUMENT_ROOT}/www%{REQUEST_URI} -d
    RewriteRule ^(.+) www/$1 [L]
    
    RewriteRule ^(.*) www/index.php/$1 [L]
    

    这个也是:

    RewriteCond %{REQUEST_URI} !www/
    RewriteRule (.*) /www/$1
    
    RewriteCond {%REQUEST_FILENAME} !-f
    RewriteCond {%REQUEST_FILENAME} !-d
    RewriteRule www/(.*) /www/index.php/$1 [PT,L]
    

    有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我认为使用单个.htaccess是不可能的,但有两个可能。

您的根目录中需要一个/.htaccess

RewriteEngine on

RewriteBase /

# We don't want infinite rewriting.
RewriteCond %{REQUEST_URI} !www/.*$
RewriteRule ^(.*)$ www/$1 [L]

您的www目录中的另一个,/www/.htaccess

RewriteEngine on

RewriteBase /www

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

答案 1 :(得分:0)

实际上,我犯了一个愚蠢的错误! %符号应位于{}括号之外!

这可以在root目录中的一个.htaccess中完成:

RewriteEngine on

RewriteCond %{REQUEST_URI} !www/ 
RewriteRule ^(.*)$ www/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^www/(.*)$ www/index.php/$1 [L]