mod_rewrite(Apache 2.4)在htdocs之外的RewriteBase

时间:2014-10-22 12:43:42

标签: apache mod-rewrite

我遇到了一个试图让我的重写规则正常工作的问题。

假设以下设置:

这样的文件夹结构:

app/
web/                         <--- Document-Root
    .htaccess                <--- My mod_rewrite rules
    index.php   

vendor/
    company/
        package/
            Folder/
                Route.php

vhost指向&#34; web /&#34;作为Document-Root,安全性降低 所以所有覆盖都是允许的:

<Directory "~PATH~\web">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order deny,allow
    allow from all
    Require all granted
</Directory>

现在我尝试简单地将每个请求(*)重写为&#34; Route.php&#34; (内部!没有301或其他东西)。 我的理解是否会打电话给&#34; www.example.com/a/b"然后我会期待的 请求被内部重定向到~PATH~ / vendor / vendor / company / package / Folder / Route.php 我可以在那里获取所有内容并在PHP中接受请求以进行进一步处理。

但重写失败了。也许它无法遍历目录&#34; /../" ?!

.htacces的内容:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /../vendor/company/package/Folder
    RewriteRule .* - [E=ROUTER:Route.php]

    # route calls to router /x/y/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . %{env:ROUTER}?mode=htaccess [QSA,L]

</IfModule>

任何帮助赞赏:) 提前谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule .* ../vendor/company/package/Folder/Router.php [L]   
</IfModule>

修改

我已经在我的本地机器上试过了。

此安装程序有效:

RewriteRule .* vendor/company/package/Folder/Router.php [L]  

似乎不允许将请求转发到比Docroot更高的目录 我发现了这篇文章:

htaccess RewriteRule redirecting to parent directory?

重要部分:

您无法重写到文档根目录之外。这是一个安全问题。

<强> EDIT2:

更多信息:mod_rewrite - Apache HTTP Server Version 2.4

<强> 引用:

  

<强> URL路径
  要提供的资源的DocumentRoot相对路径。请注意,mod_rewrite尝试通过检查文件系统根目录中是否存在路径的第一个段来猜测您是否指定了文件系统路径或URL路径。例如,如果您指定/www/file.html的替换字符串,那么这将被视为URL路径,除非在根或您的文件系统中存在名为www的目录(或者,在使用重写的情况下)在.htaccess文件中,相对于您的文档根目录),在这种情况下,它将被视为文件系统路径。如果您希望将其他URL映射指令(例如Alias)应用于生成的URL路径,请使用[PT]标志,如下所述。