【问题标题】:Unable to rewrite htaccess with multiple query strings无法使用多个查询字符串重写 htaccess
【发布时间】:2019-11-10 19:55:21
【问题描述】:

我想用多字符串查询重写url

原网址

www.xxx.com/sale.php?a=sale&&b=product&&c=category

预期的网址

www.xxx.com/sale/a/b/c

在htaccess中写了下面的代码

RewriteRule ^sale/(.*)/?$ sale.php?a=$1&b=$2&c=$3 

似乎 / 没有转义,当我试图回显 a、b 和 c。我得到了以下输出。

 $a = $_REQUEST['a'];
 $b = $_REQUEST['b'];
 $a = $_REQUEST['c'];

Output value
a = sale/product/category
b = 
c = 

Expected result

a = sale
b = product
c = category

提前致谢。

我也尝试了以下实例

 RewriteRule ^sale/(.*)$ sale.php?a=$1&b=$2&c=$3 

 RewriteRule ^sale/([^/.]+)/?$ sale.php?a=$1&b=$2&c=$3 -> This didnt worked.

 Actual value
 a = sale/product/category
 b = 
 c = 

 Expected result

 a = sale
 b = product
 c = category

【问题讨论】:

标签: php html .htaccess


【解决方案1】:

这是您正在寻找的实际规则:

RewriteEngine on
RewriteRule ^/?sale/([^/]+)/([^/]+)/([^/]+)/?$ /sale.php?a=$1&b=$2&c=$3 [END]

您的代码 sn-p 表明您正在使用 php 作为脚本语言。这意味着您可以通过以下方式访问这些值:

<?php
// ...
$a = $_GET['a'];
$b = $_GET['b'];
$c = $_GET['c'];

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的[END] 标志的明确提示。您可以尝试升级或使用旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此规则同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多