重写别名目录

时间:2012-08-28 14:12:57

标签: apache mod-rewrite mod-alias

我正在尝试首先使用Alias文件夹将项目文件存储在与DocumentRoot不同的位置,然后对此请求执行mod_rewrite。但是它似乎没有解析.htaccess文件。

这是我的Alias文件的内容:

Alias /test F:/Path/To/Project

<Directory F:/Path/To/Project>
    Order allow,deny
    Allow from all
</Directory>

这是我的.htaccess文件:

Options +FollowSymlinks
RewriteEngine on

RewriteRule .* index.php [NC] [PT]

当我删除Alias时,一切正常。

2 个答案:

答案 0 :(得分:7)

mod_alias ALWAYS优先于mod_rewrite。你永远不能用mod_rewrite覆盖mod_alias指令。

在这种情况下,AliasMatch directive可能对您有帮助。

答案 1 :(得分:4)

这是一个解决方案,可以解决您尝试使用别名和重写的一些情况,但因为它们发生冲突而无法解决。

假设特定应用程序的DocumentRoot/var/www/example.com/myapp,并且您具有以下基本目录结构,其中公共请求是public中的文件(例如,css文件) ,或以其他方式通过index.php路由。

myapp/
|- private_library/
   |- private_file.php
|- private_configs/
   |- private_file.php
|- public/
   |- index.php
   |- css/
      |- styles.css

目标是仅在public_webroot内投放内容,但网址应为example.com/myapp而不是example.com/myapp/public

以下看起来似乎应该有效:

DocumentRoot /var/www/example.com
Alias /myapp /var/www/example.com/myapp/public
<Directory /var/www/example.com/myapp/public>
    # (or in this dir's .htaccess)
    RewriteEngine On
    RewriteBase /public
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?q=$1 [QSA,PT]
</Directory>

但是,如果您请求不存在的文件的URL(即应该通过index.php路由的文件),这将导致无限循环。

一个解决方案是使用mod_alias,而只是在应用程序的根目录中使用mod_rewrite,如下所示:

DocumentRoot /var/www/example.com
<Directory /var/www/example.com/myapp>
    # (or in this dir's .htaccess)
    RewriteEngine On
    RewriteRule   (.*) public/$1 [L]
</Directory>
<Directory /var/www/example.com/myapp/public>
    # (or in this dir's .htaccess)
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
</Directory>

这就是全部!