htaccess中按什么顺序放置规则有关系吗?


9

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

Q1:规则以什么顺序放在htaccess中有关系吗? 由于它们是完全分开的项目:例如

问题2:如果可以,我是否申请了正确的订单? 为了加速htacces引擎而不用不必要的规则使其过载?

问题3:关于在此处禁用/添加内容的任何提示都欢迎+1!


# 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 /

Answers:


10

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

大多数配置设置不取决于顺序,但有些却取决于设置。

RewriteRule并且RewriteCond例如对订单敏感,因此在这种情况下,答案为是。

见例如

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

解释这些评估的顺序。


4

这非常重要。从文档中引用RewriteRule

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


1
在mod_rewrite中,这很重要-是的。但是,OP并没有专门解决mod_rewrite,OP的.htaccess文件中还有来自其他模块的许多其他指令。简而言之,来自不同模块(和位于不同容器中)的指令以预定义的顺序独立执行,而不管它们在配置文件中的明显顺序如何。
怀特先生

1

我不能说例如<files>vs 的顺序如何<Rewrite>影响性能。我想自己找出答案。我一直找不到有关此的任何信息,所以可能没关系吗??

但是,我想指出的是,在Rewritevs Redirect(和RedirectMatch)之间,执行的顺序可能不符合所列顺序,尽管这通常是人们期望的。
具体来说,mod_rewriteand mod_alias模块是独立处理/执行的,那个命令。

  1. 所有mod_rewrite指令(Rewrite)均已执行(按列出顺序)。
  2. THEN所有mod_alias中的指令(RedirectRedirectMatch)的顺序执行它们在文件中列出。

因此,即使a Redirect继续执行a Rewrite,也仅处理完所有重写,才对重定向进行处理。

如果您既有重定向又有重写,则使文件“可读”的一种方法是根本不使用该mod_alias模块。而是仅使用mod_rewrite。使用[R]标志进行重写实际上会将其变为重写。
这个网站管理员的答案显示了如何。

现在,所有指令将按照它们在文件中出现的顺序执行,因此不会有令人讨厌的惊喜,也不会对执行顺序感到困惑。或者,您可以将所有RedirectRedirectMatch指令物理上重定位到文件的“底部”,以便提醒自己,它们Rewrite无论如何都不会在s 之后执行。

这是一些很好的StackExchange答案,可以说明这一点:

至于其余的内容,例如,在放置s files之前或之后,我还找不到任何有关性能的信息rewrite。唯一的基于性能的建议,我发现是,如果一个访问服务器的配置文件,那么最好还是尽可能地移动 .htaccess文件配置文件,并禁用.htaccess文件完全(或指定特定的目录,其中.htaccess文件应该被读取)。

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


-1

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

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

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

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

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

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


脚注:RewriteRule模式替换[标志]不要回答这个明显的应用程序处理问题!
测试平台
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.