.htaccess中单个RewriteCond的多个RewriteRules

Hus*_*yin 45 apache .htaccess mod-rewrite

我的.htaccess中有以下命令

    RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
    RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
    RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]
Run Code Online (Sandbox Code Playgroud)

%2在第二行和后续行中不起作用.我可以为%2定义任何变量并在所有RewriteRule命令中使用它吗?以下命令有效

     RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
     RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
     RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
     RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]
Run Code Online (Sandbox Code Playgroud)

但是我希望在没有重复条件的情况下将%2用于多个规则行.

Jps*_*psy 59

您可以使用RewriteRule标志S|skip将多个RewriteRules绑定到单个RewriteCond(或一组RewriteConds).这是一个将一个Cond应用于三个规则的示例:

RewriteCond  %{HTTP_HOST}  !^www.mydomain.com$
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule  .?  -  [S=3]
RewriteRule  ^path1(/.*)$  /otherpath1$1
RewriteRule  ^path2(/.*)$  /otherpath2$1
RewriteRule  ^path3(/.*)$  /otherpath3$1
Run Code Online (Sandbox Code Playgroud)

要将现有的Cond更改为适用于多个规则,您必须:

  • 否定条件(前缀为!)
  • 如果您有多个RewriteConds:
    将Conds中的逻辑AND更改为OR,反之亦然.
  • 在要与条件绑定的所有规则之前添加跳过重写规则.将S参数设置为要跳过的规则行数.

请注意,在跳过的规则中无法使用任何指向RewriteCond(如%1)的反向引用.这些只能在跳过RewriteRule时访问.


Hus*_*yin 32

该变量必须保存为Apache var,然后可以在没有重复条件的情况下使用.

保存在Apache变量中显示在第二行.在第3行和第4行使用已保存的变量.

RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule .? - [E=Wa:%1,E=Wb:%2]
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/$1.%{ENV:Wb} [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/$1$3.$2 [L]
Run Code Online (Sandbox Code Playgroud)


Hoà*_*gtt 7

显然,这并不是很有趣,尤其是随着事物的发展和变得更加复杂.但是,RewriteRule语句有一个鲜为人知的选项,它告诉apache跳过下一个N个RewriteRule语句.[S = N].因此,不是每次检查请求是否不是文件而不是目录,我们可以这样做:代码块

#
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [S=3]
RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/$1 [L]
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L]
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L]
Run Code Online (Sandbox Code Playgroud)

#

我发现了这个,来自:http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/

我认为这很有帮助

  • 是的不好玩.有人应告诉Apache的人们if/else阻止.谢谢. (3认同)

Jua*_*ero 5

从 Apache 2.4 开始,您可以使用以下<If>指令:

RewriteEngine On
<If "%{HTTP:Upgrade} == 'websocket'">
    RewriteRule /nidoran/(.*)           ws://localhost:8080/nidoran/$1 [P,L]
    RewriteRule /kakuna/(.*)           ws://localhost:8081/kakuna/$1 [P,L]
    RewriteRule /porygon/(.*)           ws://localhost:8082/porygon/$1 [P,L]
</If>
Run Code Online (Sandbox Code Playgroud)

http://httpd.apache.org/docs/2.4/expr.html#examples