是否在Apache别名内匹配的RewriteRules

时间:2011-05-05 09:48:20

标签: apache mod-rewrite alias

我有一个应用程序可以在几个不同的环境中运行,有时它位于站点的顶层,或者有时它在别名内运行。

当它直接结账到正常的docroot时,我的.htaccess是这样的:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

我在具有以下别名的环境中部署了该网站:

Alias /foo /path/to/my/application/

我发现我必须将.htaccess修改为以下内容:

RewriteEngine On
RewriteBase /foo
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /foo/index.php [NC,L]

我的问题是,我怎样才能重写我的.htaccess,这样无论是否在别名下,重写都是一样的?有没有什么方法可以检测是否已设置别名,或者其他一些表达RewriteRules的方式?

2 个答案:

答案 0 :(得分:2)

由于mod_rewrite优先于mod_alias,因此您可能需要使用重写规则替换别名。

此:

Alias /foo /path/to/my/application/

会变成:

RewriteRule ^foo.*$ path/to/my/application$1 [L]

然后.htaccess文件中可能存在或可能不存在于根目录中的规则应该可以在不必更改它们的情况下运行。

答案 1 :(得分:0)

解决方案是创建符号链接,如果您有权访问文档根目录:

ln -s /<path to application> /<document root>/foo