.htaccess 对重写的URL应用htaccess重写规则

.htaccess 对重写的URL应用htaccess重写规则,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,是否可以对已重写的URL应用.htaccess重写规则 例如: 我想用timtumb.php调整图片大小(最新版本,因此应该不再存在安全漏洞)。但是URL看起来应该很好,因此我创建了以下重写规则: RewriteRule ^rz/(.*)x(.*)/r/(.*) /themes/Nerdtalk/timthumb.php?src=$3&h=$2&w=$1&q=80 这个规则工作正常,但是在启动timtumb.php(它可能会重新指向缓存文件)之前,我希望Apache检查

是否可以对已重写的URL应用.htaccess重写规则

例如: 我想用
timtumb.php
调整图片大小(最新版本,因此应该不再存在安全漏洞)。但是URL看起来应该很好,因此我创建了以下重写规则:

RewriteRule ^rz/(.*)x(.*)/r/(.*) /themes/Nerdtalk/timthumb.php?src=$3&h=$2&w=$1&q=80
这个规则工作正常,但是在启动timtumb.php(它可能会重新指向缓存文件)之前,我希望Apache检查该文件是否存在,并让Apache重定向到缓存文件,这样就不会启动timtumb.php。 因此,我创建了这个规则集:

RewriteCond %{SCRIPT_FILENAME} timthumb.php
RewriteCond %{QUERY_STRING} src=(.*)\.(png|jpe?g)&h=([0-9]+)&w=([0-9]+)&q=([0-9]+)
RewriteCond %{DOCUMENT_ROOT}/cache/%1-%4-%3-1-%5.%2 -f
RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2 [L]
  • 已经重写的URL是否可以再次重写

  • 第二部分正确吗

  • 如果有可能合并这两个规则集,请告诉我如何合并

  • 已经重写的URL是否可以再次重写

    是的,它可以。这是默认行为,如果您想更改它,可以使用[L]这样的标志:

    第二部分正确吗

    我不确定您是否可以在RewriteCond指令中使用%1等

    如果有可能合并这两个规则集,请告诉我如何合并

    我会将缓存放在与原始url相同的文件夹中:^rz/(.)x(.)/r/ 如果它存在-只要服务它,如果没有-使用php

    已经重写的URL是否可以再次重写

    是。当重写发生时(带有
    [L]
    标志或htaccess结束的规则),mod_rewrite进入下一次迭代,并从开始重新开始匹配所有规则。这就是为什么您需要在构建规则时牢记重写循环(特别是当您使用这种模式进行匹配时)

    如果您编写的规则没有
    [L]
    标志,则重写将在同一次迭代中继续进行,因此放置在当前下的任何规则都可能再次将URL重写为完全不同的URL

    第二部分正确吗

    我会说是的(尽管没有检查实际的Apache)。我只是不确定第一次重写的条件(只是我自己从来没有使用过
    %{SCRIPT\u FILENAME}
    所以不确定它到底是如何工作的)——我会使用
    %{REQUEST\u URI}timtumb\.php$
    或者类似的东西

    我要添加的唯一内容是在重写目标处添加
    ,以摆脱新创建的(上面的1条规则)查询字符串:
    RewriteRule^.*/cache/%1-%4-%3-1-%5.%2?[五十] 
    。但它应该像现在一样工作正常

    如果有可能合并这两个规则集,可以吗 告诉我怎么做

    按照这里的顺序一个接一个地放置它们。您不能将其设置为单个规则,因为第二个规则仅在缩略图已缓存时有效

    如果它不能立即工作(因为Apache的变量(
    %%{SCRIPT\u FILENAME},%%{QUERY\u STRING}
    等)可能没有正确的值,请尝试将
    [L]
    标志添加到第一个重写规则中——它将强制下一次迭代,用正确的值填充这些变量,并且,根据您在此之前可能拥有的其他规则,它将到达第二个规则集,其中将发生第二次重写


    如果您愿意--您可以完全重写它以立即检查并提供缓存文件(如果存在),然后(如果仍然没有)重写要由timtumb.php处理的图像,但这将完成与上述规则完全相同的工作,只是有点不同。

    感谢您的详细解释。但是让Apache处理文件存在性检查而不是每次启动PHP脚本不是更快吗?@Phil你在说什么?我想你对这一切的运作方式感到困惑。请描述您对上述规则的理解。第一条规则将/rz/714x357/r/screen.jpg这样的URL重写为/themes/Nerdtalk/timtumb.php?src=screen.jpg&h=357&w=714&q=80。第二条规则检查:-如果请求的脚本名等于timtumb.php-如果请求的URL的查询字符串匹配src=(.*)\(png;jpe?g)&h=([0-9]+)&w=([0-9]+)&q=([0-9]+)-如果文档_ROOT/cache/%1-%4-%3-1-%5.%2上存在一个文件(为了更好地反读:DOCUMENT_ROOT/cache/screen-714-357-1-80.jpg),并且如果所有这些条件都为真,则URL将被重写,重写将中止,然后([L])。这一切的原因是,据我所知,Apache应该比PHP脚本更快地完成检查工作,无论缓存文件是否存在。是的——你是正确的&这正是它使用这两条规则(一条接一条地执行)的方式:Apache调用的检查比PHP更快,因为没有PHP开销(PHP需要初始化,解析PHP脚本(如果不涉及代码缓存),然后执行它。它可以在非常繁忙/共享的托管服务器上发挥作用。