在 HTaccess 文件中写入 if 条件以进行 URL 重写



我的 htaccess 代码用于重写 URL 如下

RewriteEngine On
RewriteBase "/myekc/"
RewriteCond %{REQUEST_URI} ^/myekc/
RewriteCond %{REQUEST_FILENAME} !/(css|images|js)/ 
RewriteRule "/t/pepsi/(.*)$" "http://192.168.0.175:68/$1" [P]
RewriteRule "^(.*(?:xampp|htdocs)/)(.+)$" "http://192.168.0.179/myekc/t/pepsi/$2" [R,QSA,L]

这适用于 1 个 URI。我现在想写 if 条件,以这种方式写入多个 uri 例如:

<If "req('uri') == '/t/pepsi/'">
RewriteBase "/myekc/"
RewriteCond %{REQUEST_URI} ^/myekc/
RewriteCond %{REQUEST_FILENAME} !/(css|images|js)/ 
RewriteRule "/t/pepsi/(.*)$" "http://192.168.0.175:68/$1" [P]
RewriteRule "^(.*(?:xampp|htdocs)/)(.+)$" "http://192.168.0.179/myekc/t/pepsi/$2" [R,QSA,L]
</if>
<If "req('uri') == '/t/coke/'">
RewriteBase "/myekc/"
RewriteCond %{REQUEST_URI} ^/myekc/
RewriteCond %{REQUEST_FILENAME} !/(css|images|js)/ 
RewriteRule "/t/coke/(.*)$" "http://192.168.0.175:68/$1" [P]
RewriteRule "^(.*(?:xampp|htdocs)/)(.+)$" "http://192.168.0.179/myekc/t/coke/$2" [R,QSA,L]
</if>

这里不需要明确的<If>条件。使用 mod_rewrite,如果需要将指令应用于其他 URL,只需通过指定适当的RewriteRule模式来包含不同 URL 的该指令即可。例如:

RewriteEngine On
RewriteRule ^(.*(?:xampp|htdocs)/)(.+)$ http://192.168.0.179/myekc/t/pepsi/$2 [R,L]
RewriteCond %{REQUEST_URI} ^/myekc/
RewriteCond %{REQUEST_FILENAME} !/(css|images|js)/ 
RewriteRule /t/pepsi/(.*)$ http://192.168.0.175:68/$1 [P]
RewriteCond %{REQUEST_URI} ^/myekc/
RewriteCond %{REQUEST_FILENAME} !/(css|images|js)/ 
RewriteRule /t/coke/(.*)$ http://192.168.0.175:68/$1 [P]

请注意,RewriteBase指令只能在.htaccess文件中使用一次(最后一个实例获胜并控制整个文件(。但是您在发布的指令中根本没有使用,因此我暂时将其完全删除。

但是,目前,这两个规则执行相同的操作,因此可以组合在一起:

RewriteCond %{REQUEST_URI} ^/myekc/
RewriteCond %{REQUEST_FILENAME} !/(css|images|js)/ 
RewriteRule /t/(?:pepsi|coke)/(.*)$ http://192.168.0.175:68/$1 [P]

我需要 if 条件,因为我想为每个模式设置 cookie 值。因此,cookie 的值将是路径 "/t/pepsi/" 和 "/t/coke"。如果我一起使用,则考虑最后一个cookie值。示例:想要设置Header set Set-Cookie "mycookie=/t/pepsi/" "expr=-z %{req:Cookie}"Header set Set-Cookie "mycookie=/t/coke/" "expr=-z %{req:Cookie}"

您仍然不需要显式<If>条件,因为mod_rewrite允许您设置 cookie,在这种情况下可能更容易使用(因为您已经在使用 mod_rewrite 来捕获路径(。例如:

RewriteRule (/t/(?:pepsi|coke)/)(.*)$ http://192.168.0.175:68/$1 [CO=test:$1:.example.com,P]

RewriteRule指令上的CO(cookie( 标志将 cookietest(在域.example.com上(设置为请求中 URL 路径的值(即。"/t/百事可乐/"或"/t/coke/"(。

参考资料:
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_co

最新更新