【问题标题】:mod_rewrite not matching regexpmod_rewrite 不匹配正则表达式
【发布时间】:2014-05-26 17:14:57
【问题描述】:

我有一个正则表达式,在测试 at regexp101.com 时似乎可以正常工作 但这并没有在 mod_rewrite 中给我相同的结果。

所以,我要重写的 URL 是:

/modeles-voiture/Nissan/Qashqai+2

预期结果是:

/modeles.php?brand=Nissan&model=Qashqai+2

重写规则:

RewriteCond %{REQUEST_URI} ^/?modeles-voiture [NC]

RewriteRule \/([A-Z][\-A-Za-z]+)\/([\+\-A-Za-z0-9]+$) /modeles.php?brand=$1&model=$2 [L]

我从重写规则中得到的是:

/modeles-voiture/Nissan/Qashqai 2

注意缺少的 + 号,它会在 modeles.php 中抛出我的脚本

感谢您的帮助。

【问题讨论】:

  • 首先找出 + 号消失的位置。如果你去 /modeles.php?brand=Nissan&model=Qashqai+2 将$_GET['model'] 包含+字符吗?
  • @turboHz,感谢您的回复。它也可能与此有关。我只是尝试用 %2b 替换 + 号,使我的 URL /modeles-voiture/Nissan/Qashqai%2b2 但它给了我这个:modeles-voiture/Nissan/Qashqai%2b2。所以,机制不是那样的。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

我认为你想要 [B] 标志。

看这个问题的答案:How to encode special characters using mod_rewrite & Apache?

然后 mod_rewrite 将您的请求 '/tag/c++' 更改为 'script.php?tag=c++'。但是在 application/x-www-form-encoded 格式的查询字符串组件中,转义规则与应用于路径部分的规则略有不同。特别是,“+”是空格的简写(也可以编码为“%20”,但这是我们现在永远无法改变的旧行为)。

因此,PHP 的表单读取代码接收“c++”并将其作为 C-space-space 转储到您的 _GET 中。

【讨论】:

  • 感谢您的回复。用#2O 替换+ 号得到的结果与用%2B 替换它的结果相同,即返回一个类似modeles-voiture/Nissan/Qashqai%202 的URL,如果我只给出一个str_replace 来获取+ 回签。但这对我放在那里的任何特殊字符都有效。如果我只是将原始 URL 中的 + 号替换为“.”,我可以让它通过 RewriteRule,然后在目标 php 脚本中重新转换回来。所以,这并不是真正的解决方案,而是一种解决方法。
  • 您是否尝试使用 [B] 标志?
  • 一开始没有,但后来我意识到并把它放进去。但是没有用。在任何情况下,我都使用了我之前评论中提到的解决方法,即只需将 + 替换为 Apache 没有问题的其他内容(在这种情况下为“。”)。
猜你喜欢
  • 2010-10-23
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多