我希望这是一个简单的“是”或“否”的答案(请说明原因)
问题 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>
影响性能。我正在尝试自己找出答案。我找不到有关此问题的任何信息,所以可能这并不重要?
不过,我想指出的是,在Rewrite
vs Redirect
(和RedirectMatch
)之间,执行顺序可能不一定按列出的顺序排列,尽管这通常是人们所期望的。
具体来说,mod_rewrite
和mod_alias
模块是独立处理/执行的,并且那命令。
- 所有 mod_rewrite 指令(
Rewrite
)均被执行(按列出的顺序)。 - 然后所有 mod_alias 指令(
Redirect
和RedirectMatch
)均按以下顺序执行他们在文件中列出。
因此,即使 aRedirect
继续 a Rewrite
,重定向也只会被处理后所有重写均已处理。
如果同时具有重定向和重写,则保持文件“可读”的一种方法是mod_alias
根本不使用模块。相反,只使用mod_rewrite
。使用 [R] 标志的重写本质上会将其变成重写。
该网站管理员的回答展示了如何。
现在,所有指令都将按照它们在文件中出现的顺序执行,因此不会出现令人不快的意外,也不会对执行顺序产生混淆。或者,你可以将所有Redirect
和RedirectMatch
指令物理地重新定位到文件的“底部”,以便提醒自己它们Rewrite
无论如何都要等到 s 之后才会被执行。
以下是一些很好的 StackExchange 答案,它们对这一点有所启发:
至于其他方面,我找不到任何关于在sfiles
之前或之后放置的性能信息rewrite
。我发现的唯一基于性能的建议是,如果可以访问服务器配置文件,那么最好尽可能多地移动从.htaccess 文件到配置文件,并完全禁用 .htaccess 文件(或指定 .htaccess 文件所在的特定目录应该被阅读)。
这里的逻辑是,配置文件中的规则只需要读取一次。如果打开了 htaccess 处理,那么每一个要求,每一个必须搜索服务器目录(位于请求目录或高于请求目录)以查找可能的 htaccess 文件,无论它们是否存在。如果存在,则必须重新读取每个文件。
- Apache 文档在“.htaccess 文件”部分的底部提到了这一点,但没有解释原因,您必须仔细研究才能找到原因。
- http://www.apacheweek.com/features/tips“如何加速 Apache 部分”直观地演示了为什么很快。
- Apache 性能:禁用 .htaccess- 首先跳转到阅读“在 Apache 配置中禁用 .htaccess 并使用 mod_rewrite”部分。
答案4
我发布了同样的担忧,但这是一个服务器管理站点的观点,允许他们在 apache 服务器配置更改后重新启动 apache。
到目前为止,我收到的最佳回应是首先列出与文件相关的指令。
这与 apache 需要管理目录以及每个目录中的 htaccess 指令有关。
因此,首先列出与文件相关的指令,然后按照明显的顺序列出明显的块以结束 apache htaccess 进程。
优化请求的可能解决方案: - 请求 url 相关更正 - 目录相关限制 - 索引相关限制 - 文件相关限制 - 代理限制 <- 全部杀死 - 空用户代理 <- 全部杀死 ... 这个列表很有趣
我的顾虑与指令顺序有关。例如,我是否应该在 RewriteConds 之前设置 Index、file 和 Header 指令?