7

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

这是我的别名文件的内容:

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]

当我删除别名时,一切正常。

4

2 回答 2

7

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

在这种情况下,AliasMatch 指令可能会对您有所帮助

于 2012-08-28T14:14:42.597 回答
5

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

假设您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

目标是仅在内部提供内容,但是 URL不public_webroot应该是.example.com/myappexample.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>

就这样!

于 2015-09-06T03:42:30.020 回答