Apache Alias 链接到另一个 DocumentRoot

Apache Alias 链接到另一个 DocumentRoot

我在 中安装了 WordPress /var/www/wordpress/,并在/var/www/project/

现在出现以下问题:当我尝试访问example.com/client/example.com/admin/它应该链接到/var/www/project/并从那里执行.htaccess + index.php。

我尝试在 Apache 配置中放置 Alias 指令,并取得部分成功。

Alias /admin/ /var/www/project
Alias /client/ /var/www/project

当我访问时example.com/client/它工作正常,但是当我请求时example.com/client/login它就会失败并出现File does not exist: /var/www/project/login错误。

看起来像.htaccess/var/www/project

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.*)$ index.php?module=$1&task=$2 [L,QSA]

答案1

首先:我最讨厌的事情,引自.htaccess 手册文件:

你应该完全避免使用 .htaccess 文件如果您有权访问 httpd 主服务器配置文件。使用 .htaccess 文件会降低 Apache http 服务器的速度。最好将 .htaccess 文件中包含的任何指令设置在目录块中,因为它将具有相同的效果且性能更好。

第二:几乎所有 mod_rewrite 问题的规范答案是这里

我不太确定,但我认为通过设置重写库内部/重定向将指向 example.com/index.php,而不是 /var/www/project/index.php。另外,我认为太平洋标准时间需要标志来考虑别名匹配。

你可能想尝试

Alias /admin/ /var/www/project
Alias /client/ /var/www/project
<Directory /var/www/project>
  RewriteEngine On
  RewriteBase /
  # Do nothing when a file or directory with the requested name exists
  RewriteCond %{REQUEST_FILENAME} -f  [OR]
  RewriteCond %{REQUEST_FILENAME} -d
  RewriteRule ^.* - [L]

  # Use the request URL to select the correct module and task
  RewriteRule ^/([^/]+)/(.*)$ /$1/index.php?module=$1&task=$2 [PT,L,QSA]
</Directory>

答案2

Alias 的文档表明这是预期的行为。Alias 会将所有尾随路径附加到别名路径之后。

我认为你想要的是扔掉别名中的附加路径信息,通过

AliasMatch /(admin|client)/.* /var/www/project

这应该将请求发送到 /var/www/project,同时保留原始请求的 URL 路径以供 RewriteRule 处理。

相关内容