重写别名目录

TJH*_*vel 7 apache mod-rewrite mod-alias

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

这是我的Alias文件的内容:

Alias /test F:/Path/To/Project

<Directory F:/Path/To/Project>
    Order allow,deny
    Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)

这是我的.htaccess档案:

Options +FollowSymlinks
RewriteEngine on

RewriteRule .* index.php [NC] [PT]
Run Code Online (Sandbox Code Playgroud)

当我删除别名一切正常.

小智 7

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

在这种情况下,AliasMatch指令可以帮助您.


Syn*_*xis 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
Run Code Online (Sandbox Code Playgroud)

目标是只提供内部内容public_webroot,但是 URL 不应该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>
Run Code Online (Sandbox Code Playgroud)

但是,如果您请求一个不存在的文件的 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>
Run Code Online (Sandbox Code Playgroud)

就这样!