我正在尝试首先使用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时,一切正常。
答案 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>
这就是全部!