解释.htaccess文件

时间:2016-03-23 07:44:30

标签: apache .htaccess

有人可以向我解释这些.htaccess规则的含义吗?

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

1 个答案:

答案 0 :(得分:1)

让我们一步一步地做:

Options -MultiViews
  

From Apache documentation

     

多视图搜索由多视图选项启用。如果服务器收到/some/dir/foo的请求并且/some/dir/foo不存在,那么服务器将读取目录,查找名为foo.*的所有文件,并有效地伪造一个类型映射,其中列出了所有这些如果客户端通过名称请求其中一个文件,则为它们分配相同的媒体类型和内容编码。然后,它会根据客户的要求选择最佳匹配,并返回该文档。

RewriteEngine On
  

From Apache documentation

     

RewriteEngine 指令启用或禁用运行时重写引擎。如果设置为off,则此模块根本不进行运行时处理。它甚至不更新SCRIPT_URx环境变量。

     

使用此指令禁用特定上下文中的规则,而不是注释掉所有RewriteRule指令。

     

请注意,重写配置不会被虚拟主机继承。这意味着您需要为要在其中使用重写规则的每个虚拟主机指定RewriteEngine on。

RewriteRule ^(.*)/$ /$1 [L,R=301]

此规则将捕获带有斜杠的任何请求,例如http://www.example.com/test/

在此请求中,只有test部分会被捕获,因为尾随/位于捕获括号( )之外。

然后它会将用户重定向到http://www.example.com/ +捕获字符串testhttp://www.example.com/test[L]标志表示不会检查其他规则。 [R=301]标记表示用户将使用301代码重定向到此页面。

因此,此规则的目的是删除尾部斜杠。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

这部分通常称为Dispatcher。任何未指向文件(%{REQUEST_FILENAME} !-f)或目录(%{REQUEST_FILENAME} !-d)的请求都将发送至index.php

此规则的目的是将重写的查询(例如http://www.example.com/user/1/florian(文件系统上没有名为user/1/的文件夹florian)重定向到index.php谁将能够处理这个请求。