【问题标题】:mod_rewrite: encode only certain matches in URLmod_rewrite:仅编码 URL 中的某些匹配项
【发布时间】:2014-07-23 13:08:40
【问题描述】:

我正在尝试使用 mod_rewrite 重写一个 URL,并在我的 URL 中对括号之间的子字符串进行编码。我的网址:

http://localhost/something?var_a=A&var_b=(B&2/3&)&var_c=C

还有我的 .htaccess:

RewriteEngine On
RewriteCond %{QUERY_STRING} (.+)\((.*?)\)(.+) 
RewriteRule ^.*$ somedir/%1%2%3? [R,B]

所以我捕获了三个字符串,括号之前的任何内容,括号内的任何内容以及之后的任何内容。

结果是:

somedir/var_a%3dA%26var_b%3dB%262%2f3%26%26var_c%3dC

但我只想对初始 URL 括号内的文本进行编码,这样

somedir/var_a=A&var_b=dB%262%2f3%26&var_c=C

问题似乎是[B] 选项解码了整个字符串。有没有办法选择性地做到这一点?另外,我的解决方案只能捕获一次括号的出现,如果有这个更通用的就好了;有人可以给我一个提示吗?

请注意,这个问题与我的 previous one 有关,我试图在其中捕获括号之间的文本。

【问题讨论】:

  • 你在使用 php 吗?
  • 不,我正在使用 mod_perl
  • 我有一个解决方案给你,但我对 perl 不熟悉。解决方案是仅将一个参数传递给您的应用程序,即somedir/... 之后的字符串,然后您可以从字符串中提取所需的所有数据
  • 使用 apache 请求对象?我可以从中访问整个字符串并对其进行解码,但我不知道如何告诉请求对象然后从解码的字符串中提取参数...

标签: apache .htaccess mod-rewrite url-rewriting urlencode


【解决方案1】:

这对mod_rewrite 来说非常棘手,但我试了一下。解决方案并不漂亮,因为它涉及 2 次重定向和 cookie 的使用,但它确实有效。

RewriteEngine On

# store non bracket query string in cookie while redirecting value in brackets using B flag
RewriteCond %{QUERY_STRING} ^(.+?&)?(var_b=)\(([^)]*)\)(.*)$ [NC]
RewriteRule !^somedir/ /somedir/%3? [L,CO=QS:%1-%2-%4:%{HTTP_HOST},B,R]

# retrieve value from cookie and use it to construct full URL
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_COOKIE} QS=([^-]*)-([^-]+)-([^;]+) [NC]
RewriteRule ^(somedir)/(.*)$ /$1/%1%2$2%3? [L,R,NE]

当我访问这个 URL 时使用这些规则:http://localhost/something?var_a=A&var_b=(B&2/3&)&var_c=C

它被重定向到:http://localhost/somedir/var_a=A&var_b=B%262%2f3%26&var_c=C

【讨论】:

  • 谢谢!但是,我无法让它工作,我被重定向到 http://localhost/somedir/B%25262%252f3%2526,只有变量 B。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多