规则在 htaccess 中的放置顺序重要吗?

规则在 htaccess 中的放置顺序重要吗?

我希望这是一个简单的“是”或“否”的答案(请说明原因)

问题 1:在 htaccess 中放置规则的顺序有关系吗?
尤其是当它们是完全分开的物品时。

Q2:如果是,我应用的顺序正确吗?
我想加快 htacces 引擎的速度并且不让其因不必要的规则而超载。

Q3. 欢迎提供关于删除/添加内容的任何建议。
谢谢!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################
    
# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /

答案1

嗯,.htaccess 文件使用与常规 Apache 配置文件相同的格式,因此适用相同的规则。

大多数配置设置不依赖于顺序,但有些则依赖于设置。

RewriteRule例如RewriteCond对顺序很敏感,所以在这种情况下答案是肯定的。

例如

http://wiki.apache.org/httpd/RewriteRule

以解释这些评估的顺序。

答案2

这确实很重要。引自RewriteRule 的文档

定义这些规则的顺序很重要——这是它们在运行时应用的顺序。

答案3

<files>例如,我无法谈论vs的顺序如何<Rewrite>影响性能。我正在尝试自己找出答案。我找不到有关此问题的任何信息,所以可能这并不重要?

不过,我想指出的是,在Rewritevs Redirect(和RedirectMatch)之间,执行顺序可能不一定按列出的顺序排列,尽管这通常是人们所期望的。
具体来说,mod_rewritemod_alias模块是独立处理/执行的,并且命令。

  1. 所有 mod_rewrite 指令(Rewrite)均被执行(按列出的顺序)。
  2. 然后所有 mod_alias 指令(RedirectRedirectMatch)均按以下顺序执行他们在文件中列出。

因此,即使 aRedirect继续 a Rewrite,重定向也只会被处理所有重写均已处理。

如果同时具有重定向和重写,则保持文件“可读”的一种方法是mod_alias根本不使用模块。相反,只使用mod_rewrite。使用 [R] 标志的重写本质上会将其变成重写。
该网站管理员的回答展示了如何。

现在,所有指令都将按照它们在文件中出现的顺序执行,因此不会出现令人不快的意外,也不会对执行顺序产生混淆。或者,你可以将所有RedirectRedirectMatch指令物理地重新定位到文件的“底部”,以便提醒自己它们Rewrite无论如何都要等到 s 之后才会被执行。

以下是一些很好的 StackExchange 答案,它们对这一点有所启发:

至于其他方面,我找不到任何关于在sfiles之前或之后放置的性能信息rewrite。我发现的唯一基于性能的建议是,如果可以访问服务器配置文件,那么最好尽可能多地移动.htaccess 文件配置文件,并完全禁用 .htaccess 文件(或指定 .htaccess 文件所在的特定目录应该被阅读)。

这里的逻辑是,配置文件中的规则只需要读取一次。如果打开了 htaccess 处理,那么每一个要求,每一个必须搜索服务器目录(位于请求目录或高于请求目录)以查找可能的 htaccess 文件,无论它们是否存在。如果存在,则必须重新读取每个文件。

答案4

我发布了同样的担忧,但这是一个服务器管理站点的观点,允许他们在 apache 服务器配置更改后重新启动 apache。

到目前为止,我收到的最佳回应是首先列出与文件相关的指令。

这与 apache 需要管理目录以及每个目录中的 htaccess 指令有关。

因此,首先列出与文件相关的指令,然后按照明显的顺序列出明显的块以结束 apache htaccess 进程。

优化请求的可能解决方案: - 请求 url 相关更正 - 目录相关限制 - 索引相关限制 - 文件相关限制 - 代理限制 <- 全部杀死 - 空用户代理 <- 全部杀死 ... 这个列表很有趣

我的顾虑与指令顺序有关。例如,我是否应该在 RewriteConds 之前设置 Index、file 和 Header 指令?

相关内容