【问题标题】:prevent apache from processing urls阻止 apache 处理 url
【发布时间】:2017-05-25 19:03:28
【问题描述】:

我希望 apache 将所有内容重写到我的 index.php,这意味着 apache 不应该处理任何内容,它应该忽略 url 输入并将其转发到 index.php。

我已经搜索了很多次,我找到的最佳解决方案是:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . index.php [L]
    </IfModule>

但今天我注意到,如果我输入现有路径,apache 将显示禁止页面,我不希望这样。我想要的是始终显示 index.php,无论 uri 是什么(显然是域名后面的部分:P)。

我正在使用$_SERVER['REQUEST_URI'] 让 PHP 使用 MVC 应用程序路由所有内容,因此 apache 尝试处理 url 输入非常冲突。

我禁用了索引,我也在考虑拒绝访问文档根目录并只允许 index.php 所在的文件夹:

httpd.conf:

<Directory "/srv/http">
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

vhost.conf:

<VirtualHost *:80>
    ServerName example.com
    #Redirect permanent / http://www.example.com/

    DocumentRoot "/srv/http/example.com/www"
    <Directory "/srv/http/example.com/www">
        Require all granted
        <Files "index.php">
            SetHandler "proxy:unix:/run/php-fpm/www.example.sock|fcgi://localhost/"
        </Files>

        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteRule ^index\.php$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . index.php [L]
        </IfModule>
    </Directory>

    <IfModule dir_module>
        DirectoryIndex index.php
    </IfModule>
</VirtualHost>

我什至只想允许访问 index.php 文件,但也许这有点矫枉过正?

在 &lt;Files&gt; 块内移动 Require all granted 不起作用,但这是次要的,你可能会阻止我尝试(甚至可能是不可能的,或者是必要的)。

那么,如何防止 apache 处理 url?让我的 MVC 应用处理路由。

【问题讨论】:

    标签: apache mod-rewrite url-rewriting


    【解决方案1】:

    好吧,您正在使用的重写代码专门排除了现有的 URL,所以请停止。你也不需要RewriteBase。

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^index\.php$ - [L]
        RewriteRule . index.php [L]
    </IfModule>
    

    如果您需要更多信息,请告诉我,但看起来这应该会让您走上正轨,实现您想要实现的目标。您是否没有任何图像文件、CSS 等您希望 Apache 自己提供服务?这是排除现有 URL 的通常原因。

    【讨论】:

    • 是的,ofc,我有静态文件,但它们由一个子域 (static.domain.com) 单独提供,每个文件都有默认处理程序(这样更安全,左右我认为)。
    • 仍然显示禁止 /.htxxx 文件(不存在的文件),但我想我将不得不忍受它(除非你也知道这种方法),它实际上并不大交易。关于另一件事,在父文件夹中使用Require all denied,在vhost doc root 中使用Require all granted,甚至只允许(如果可能的话)index.php,这是矫枉过正还是没有必要/可能?我只想要最安全的配置。谢谢。
    • 不知道你对显示 /.htxxx 的禁止是什么意思。如果您的意思是文件以 .ht 开头,那么默认 Apache 配置在主配置中禁止使用这些文件,以防止查看 .htaccess 和 .htpasswd 文件。您是否考虑过将SetHandler 应用于每个 URL,而不是使用 mod_rewrite?您可以将其放在 &lt;Directory&gt; 块中并以这种方式传递所有内容。
    • 关于拒绝什么,如果您坚持使用 mod_rewrite 方法,是的,您可以阻止除 index.php 之外的所有内容,如果您愿意的话。伤不起。但真正发挥作用的是您的文件系统权限,而不是您在 Apache 中允许的权限。可能会被入侵的是您的 PHP 脚本,而不是 Apache,它将所有内容都定向到您的脚本,因此如果发生这种情况,则需要通过仔细维护您的文件系统权限来控制活动。
    • 很有趣,我可以禁用 mod_rewrite 并使用其他方法吗?我不知道该怎么做,您介意在您的答案中添加一个示例(带链接)吗?另一件事,所以如果权限很好,并且 http 用户只能访问 doc 根目录中的内容,那么一切都会好起来吗?是的,php 脚本可能很容易受到攻击,但是当我学习新东西时,我会不断地了解有关 php 安全性和更新的更多信息。泰!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2012-09-07
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多