【问题标题】:.htaccess rewrite rule killing me.htaccess 重写规则杀了我
【发布时间】:2019-12-17 16:15:25
【问题描述】:

我正在尝试为 .htaccess 编写重写规则。我想我已经很接近了,但是我改变了一件事,然后又搞砸了另一件事。我对 .htaccess 或正则表达式不是很精通,我可以使用一些帮助。

这是我需要的逻辑。

我开始:

RewriteEngine on

我有一个包含子文件夹的文件夹。 1)我需要文件夹和子文件夹为403,所以我这样做了,它起作用了:

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^ - [R=403]

到目前为止一切顺利。

2) 子文件夹内有图片,同一张图片的不同尺寸,但它们还不存在。 我有一个 image.original.png 文件。

如果直接请求这个文件,但不存在,我需要它显示404。所以我做了:

RewriteCond %{REQUEST_FILENAME} ^(.*)\.original\.png$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^ - [R=404]

这似乎也可以正常工作。 这是我卡住的部分。

如果直接请求 image.original.png 文件并且它确实存在,我想显示另一个文件 image.png。如果 image.png 不存在,它将被重定向到 index.php,它将生成 image.png,保存以供进一步使用并显示它。

所以重点是,用户永远不会看到 image.original.png

然后是最后一部分。 image.png 有几种变体,可以是 image.280.png image.420.png image.660.png image.880.png,你懂的。

当请求任何这些变体时,如果它们存在,它应该只是为它们服务。

如果不存在,则应检查 image.original.png,如果不存在,则应显示 404。

如果 image.original.png 存在,那么它应该转到 index.php,其中会生成 image.requestedvariation.png,保存以供将来使用和提供。

这是我目前得到的...

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^ - [R=403]

RewriteCond %{REQUEST_FILENAME} ^(.*)\.original\.png$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^ - [R=404]

RewriteCond %{REQUEST_FILENAME} ^(.*)\.original\.png$

RewriteRule ^(.*)\.original\.png$ ./$1.png

RewriteCond %{REQUEST_FILENAME} !^(.*)\.(.*)\.png$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} ^(.*)\.(.+)\.png$

RewriteRule ^(.*)\.(.+)\.png$ ./$1.original.png

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php

在那场混乱中的某个时刻,我迷路了。

请帮忙! :D 提前致谢!

【问题讨论】:

  • 你能简化一下这个问题吗?你是不是遇到了错误,I just got lost 没什么好说的。
  • 我有时会收到一个错误,有时它会在不应该出现的情况下退回到 inedx.php。上面的代码没有错误,但它没有检查 item.original.png 是否存在以查看它是否显示变化。

标签: regex .htaccess mod-rewrite


【解决方案1】:

看来我终于让它工作了! :D

这是代码:(我在 index.php 中添加了一堆变量进行调试,但我想它们并不是真正需要的)

#TURN REWRITEENGINE on
RewriteEngine on

#IF FILENAME IS DIRECTORY
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [R=403,L]

#IF FILENAME ENDS WITH .original.png AND FILENAME DOES NOT EXIST
#REDIRECT 404
RewriteCond %{REQUEST_FILENAME} ^(.*)\.original\.png$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ - [R=404,L]

#RULE 1
#IF FILENAME ENDS WITH .original.png 
RewriteCond %{REQUEST_FILENAME} ^(.*)\.original\.png$
#AND FILE WITHOUT .original DOES NOT EXIST
RewriteCond ./%1.png !-f
#PIPE TO index.php
RewriteRule ^(.*)\.original\.png$ index.php?rule=1&f=%{REQUEST_FILENAME}&r=./$1.png&r0=$0&r1=$1&r2=$2&r3=$3&r4=$4&r5=$5&r6=$6&r7=$7&r8=$8&r9=$9&c0=%0&c1=%1&c2=%2&c3=%3&c4=%4&c5=%5&c6=%6&c7=%7&c8=%8&c9=%9 [L]

#RULE 2
#IF FILENAME ENDS WITH .original.png 
#AND FILE WITHOUT .original DOES EXIST SINCE IT SKIPPED RULE 1
#REWRITE TO FILE WITHOUT .original
RewriteCond %{REQUEST_FILENAME} ^(.*)\.original\.png$
RewriteRule ^(.*)\.original\.png$ ./$1.png

#RULE 3
#IF FILENAME IS .png WITHOUT ANY SUFFIX
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(.*)\.png$
#AND FILENAME IS .png
RewriteCond %{REQUEST_FILENAME} ^(.*)\.png$
#AND .original DOES exist
RewriteCond ./%1.original.png -f
#AND FILENAME WITHOUT SUFFIX DOES NOT EXIST
RewriteCond %{REQUEST_FILENAME} !-f
#PIPE TO index.php
RewriteRule ^(.*)\.png$ index.php?rule=3&f=%{REQUEST_FILENAME}&r0=$0&r1=$1&r2=$2&r3=$3&r4=$4&r5=$5&r6=$6&r7=$7&r8=$8&r9=$9&c0=%0&c1=%1&c2=%2&c3=%3&c4=%4&c5=%5&c6=%6&c7=%7&c8=%8&c9=%9 [L]

#RULE 4
#IF FILENAME IS .png WITH SUFFIX
RewriteCond %{REQUEST_FILENAME} ^(.*)\.(.*)\.png$
#AND FILENAME DOES NOT EXIST
RewriteCond %{REQUEST_FILENAME} !-f
#PIPE TO index.php
RewriteRule ^(.*)\.png$ index.php?rule=4&f=%{REQUEST_FILENAME}&r0=$0&r1=$1&r2=$2&r3=$3&r4=$4&r5=$5&r6=$6&r7=$7&r8=$8&r9=$9&c0=%0&c1=%1&c2=%2&c3=%3&c4=%4&c5=%5&c6=%6&c7=%7&c8=%8&c9=%9 [L]

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多