【问题标题】:.htaccess RewriteRule for specific query string.htaccess RewriteRule 用于特定查询字符串
【发布时间】:2018-07-25 10:47:34
【问题描述】:

我想为特定查询属性重写规则

例如

https://website.com/shop/?req=cosmetics

到:

https://website.com/shop/cosmetics

我做到了:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^shop/(.+)$ shop/?req=$1 [L,QSA]

我的问题是这将替换任何查询属性...

我正在寻找的是在 '?req=' 上显式执行 RewriteRule 并让任何其他属性,例如'?foo=' 只是为了传递和执行。

我知道 RewriteCond %{QUERY_STRING} 可以做到这一点,但我无法让它工作......

谢谢

【问题讨论】:

  • 您的规则将/shop/<anything> 重写为/shop/?req=<anything>。您希望这种重写行为有什么改变?
  • 除了 '?req=' 之外,我想忽略任何其他情况下的重写规则。所以如果我发送 /shop/?foo=whatever 它应该忽略它,就像我从来没有任何重写规则一样。
  • 所以我假设我需要一个类似 %{QUERY_STRING} ^?req= 的条件。只有这样它才能让重写规则发生!
  • 这是您的完整 .htaccess 吗?正如我所说,您当前的规则是将/shop/<anything> 重写为/shop/?req=<anything>。如果您在浏览器中输入/shop/?foo=<anything>,则当前规则不会执行任何操作。
  • 嘿,anubhava,原来我的代码中有一个错误...在我的 ?foo=test 请求后我没有返回 false,代码只是继续做其他工作人员所以我很困惑...感谢您确认此代码和平是正确的!

标签: .htaccess mod-rewrite query-string


【解决方案1】:

解决方案是更改第一条规则并执行类似操作,否则服务器无法预测除现有查询字符串之外的其他查询字符串 req

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^shop/(.*)/(.*)$ /shop/?$1=$2 [L,QSA]

因此,请求 https://website.com/shop/?req=cosmetics 将来自 https://website.com/shop/req/cosmetics 请求,而 .正如您所建议的那样,https://website.com/shop/?foo=cosmetics 将来自 https://website.com/shop/foo/cosmetics 请求

如果您想从商店目录.htaccess 文件中应用此代码:

   RewriteEngine On       
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_URI} !^/shop/merchant 
   RewriteRule ^(.*)/(.*)$ /?$1=$2 [L,QSA]

它也会排除merchant,测试一下。

【讨论】:

  • 我的应用程序位于同一目录“/shop/”中,该过程在内部通过检查查询属性“/shop/?req=cosmetics”来获取化妆品,但我想什么时候我有例如/shop/?merchant=123 不做任何重写!所以我希望 RewriteRule 仅在我有 /shop/?req= 时发生
  • 嘿 Mohammed Elhag,感谢您查看此内容,事实证明我的代码中有一个错误让我感到困惑! ://
猜你喜欢
  • 2019-01-02
  • 2015-05-27
  • 2013-12-21
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
相关资源
最近更新 更多