.htaccess if-then-like select rewrite

时间:2018-03-11 20:23:12

标签: .htaccess mod-rewrite url-rewriting

##### PART 1

# IF:
RewriteRule ^ac$ /ac05182018.pdf [R=301,NC,L]
# THEN:
RewriteCond %{DOCUMENT_ROOT}/downloads/$1 -f
RewriteRule ^(.+\.(pdf))$ downloads/$1 [L]

##### PART 2

# IF:
RewriteRule ^ac64$ /ac64_05182018.pdf [R=301,NC,L]
# THEN:
RewriteRule ^(.*).(pdf)$ download.php?file=$1.$2 [L] 

" 第1部分"独立工作(=如果请求 http ... mysite.com/ac 然后重写为" http ... mysite.com/downloads/ac05182018.pdf&#34)。

" 第2部分"也是独立的(=如果有人请求 http ... mysite.com/ac64 ,那么这会重写为" http ... mysite.com/download.php?file= ac64_05182018.pdf "。)

我想知道如何实现以下

我需要将它们(第1部分和第2部分)合并,这样任何一个都将被执行,我的意思是两者都有效,具体取决于请求的文件( / ac / ac64 )。

当我这样做时,"第1部分"不再改写为" /downloads/ac05182018.pdf"然后停止执行其余的操作。而是重写为" http ... mysite.com/download.php?file=downloads/ac05182018.pdf" ...

知道如何实现这个目标吗? 类似的东西:

# IF:
RewriteRule ^ac$ /ac05182018.pdf [R=301,NC,L]
# THEN:
RewriteCond %{DOCUMENT_ROOT}/downloads/$1 -f
RewriteRule ^(.+\.(pdf))$ downloads/$1 [L]

# ELSE

# IF:
RewriteRule ^ac64$ /ac64_05182018.pdf [R=301,NC,L]
# THEN:
RewriteRule ^(.*).(pdf)$ http...mysite.com/download.php?file=$1.$2 [L] 

可能使用RewriteRule标志[S]或

<If ... >
...
</If>
<Else>
...
</Else>

How to write "if...else" mod_rewrite statements in .htaccess的答案中看到了什么?

1 个答案:

答案 0 :(得分:0)

首先,此行RewriteCond %{DOCUMENT_ROOT}/downloads/$1 -f将阻止执行下一个规则RewriteRule ^(.+\.(?:jpe?g|pdf))$ downloads/$1 [L],因为您尚未在文档根目录中进行下载。

删除后,.pdf个文件将有两个规则:

RewriteRule ^(.+\.(?:jpe?g|pdf))$ downloads/$1 [L]

和此:

RewriteRule ^(.*).(rar|zip|pdf)$ http...mysite.com/download.php?file=$1.$2 [R,L] 

除非你做了某些条件,否则其中一个条件都匹配.pdf,这会产生错误。

此外,不要忘记将L标志放在这里:

RewriteRule ^ac64$ /ac64_05182018.pdf [R=301,NC]

应为RewriteRule ^ac64$ /ac64_05182018.pdf [R=301,NC,L]

L标志表示如果规则匹配,则不会处理其他规则。

如果我理解你,你的代码应该是这样的:

 RewriteEngine On

 #Part 1
 RewriteRule ^ac$ /ac05182018.pdf [R=302,NC,L]
 RewriteCond %{REQUEST_URI} !(downloads|ac64)
 RewriteRule ^(.+)\.(jpe?g|pdf)$ /downloads%{REQUEST_URI} [L]

 #part 2
 RewriteRule ^ac64$ /ac64_05182018.pdf [R=302,NC,L]
 RewriteCond %{REQUEST_URI} !downloads
 RewriteRule ^(.+)\.(rar|zip|pdf)$ /download.php?file=$1.$2 [L] 

清除浏览器缓存并对其进行测试,如果可以,请将302更改为301以获得永久重定向。

注意: .pdf不以ac64开头的任何ac文件将由crosstab规则第一规则处理。