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更改为适用于多个规则,您必须:
请注意,在跳过的规则中无法使用任何指向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)
显然,这并不是很有趣,尤其是随着事物的发展和变得更加复杂.但是,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 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
归档时间: |
|
查看次数: |
55562 次 |
最近记录: |