【问题标题】:Remap request to different local path将请求重新映射到不同的本地路径
【发布时间】:2016-09-08 09:21:41
【问题描述】:

我想用我的网络服务器为多个子域提供服务:

example.com
projects.example.com
blog.example.com
wiki.example.com
...

文档根目录设置如下:

ServerName   example.com
ServerAlias   *.example.com
VirtualDocumentRoot "/var/www/%0/public"

这很有效,因为它会自动将文档根目录设置为相应的子域。然而,我的下一个要求是,它应该检测文档根目录中的 public 文件夹是否存在,如果不存在,则从较早的一个目录中提供文件。

我的大多数应用程序都是用 Laravel 编写的,所以它们带有一个 public 文件夹,但有时我只想快速创建一个没有 public 的新脚本或部署没有 public 的外部软件。

因此,example.com(只提供静态index.htmlstyle.css)的文档根目录应该是/var/www/example.com/ 而不是/var/www/example.com/public。我通过重写规则尝试了这个:

<If "!-d '/var/www/' . %{HTTP_HOST} . '/public'">
    RewriteEngine on
    RewriteRule ^ "/var/www/%{HTTP_HOST}" [L,QSA]
</If>

这是重写错误日志的结果:

[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] init rewrite engine with requested uri /
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] pass through /
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] add path info postfix: /var/www/example.com -> /var/www/example.com/public/
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] applying pattern '^' to uri '/var/www/example.com/public/'
[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] rewrite '/var/www/example.com/public/' -> '/var/www/example.com'
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] initial URL equal rewritten URL: /var/www/example.com [IGNORING REWRITE]

如您所见,它正确映射了它,但由于某种原因没有从那里提供文件(我认为这是因为它没有附加 index.html 或类似的东西)。

我该如何解决这个问题?

【问题讨论】:

    标签: apache apache2.4


    【解决方案1】:

    这是因为核心看到不存在的 public/ 并将其从当前文件名中拆分出来并放入 PATH_INFO。即使是 [DPI] 标志在这里也无济于事,因为它在最后一分钟删除了 PATH_INFO 作为重写的副作用。

    不幸的是,您尝试放弃 PATH_INFO 的这种更改被 mod_rewrite 的“循环检测”捕获,并被误认为文件名没有更改。

    你应该颠倒你的逻辑,这样就不会注入流浪的 PATH_INFO。然后重写将可选地添加公共后缀而不是删除它。

    这也允许您通过在 RewriteCond 中使用典型的 -d 测试来放弃否定和真正的全部。

    【讨论】:

    • 你能给我举个例子吗?我用this config 试过了,据我了解,这就是你的建议。它仍然会导致循环检测。如果我为RewriteRule 使用END 标志,它按预期工作,但显然不会从我的.htaccess 加载任何重写规则,因此应用程序的路由在public 文件夹存在的地方被破坏
    • 这是一个错误日志示例(带有rewrite:trace3 级别),当我在没有[END] 标志的情况下使用它时:pastebin.com/c6KDdh5b
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多