用product / 1代替product.php?id = 1

时间:2019-05-30 09:53:58

标签: regex apache .htaccess mod-rewrite

这不是真正的问题,而是一个问题。

我有这个文件,当您转到const array = [ [ '2','Yes'], [ '2','Yes'], [ '2','Yes'], [ '3','Yes'], [ '3','Yes'], [ '4','Yes'], ]; const result = Object.entries(array.reduce((a, [id]) => { a[id] = (a[id] || 0) + 1; return a; }, {})).map(([ID, Count]) => ({ID, Count})) .sort((a, b) => a.Count - b.Count); console.log(result);时显示产品信息,如何使它在转到URL/product.php?id=1时显示相同的信息。 URL/product/1是一个可变的变量。

对不起,我不知道htaccess的工作原理以及重写方式。

1 个答案:

答案 0 :(得分:1)

您需要将请求从/product/1内部重写到/product.php?id=1。在Apache上,您需要使用mod_rewrite进行此操作。在.htaccess中,格式为:

# We must enable the rewrite engine before using mod_rewrite
RewriteEngine On

# Internally rewrite a request from "/product/1"
RewriteRule ^product/1$ /product.php?id=1 [L]

请注意,这实际上是从/product/1重写为/product.php?id=1(如问题中所述)。并且是服务器的内部-浏览器地址栏中的URL不变。

Apache指令的参数以空格分隔:

  1. ^product/1$-RewriteRule指令的第一个参数( pattern )是regular expression (regex),它与URL路径匹配(仅)的请求。请注意,在.htaccess中,此URL路径不是以斜杠开头,因此,即使您请求的是product/1,匹配的URL路径也是/product/1而不是example.com/product/1

  2. /product.php?id=1-第二个参数( substitution )是用于替换所请求URL的字符串。即。目标网址。这是一个“普通”字符串,而不是正则表达式。

  3. [L]-第三个参数( flags )是可以更改RewriteRule指令行为的其他选项。参数必须用方括号括起来,并包含用逗号分隔的标志列表。 L(或last)标志表示这是此轮处理中的 last 指令。如果这是文件中的最后一条指令,则不需要L标志。如果省略L标志,则处理将继续,并且可以进一步重写请求(如果您有更多指令)。另一个常见标志是R(或redirect)标志。这会将内部重写更改为外部重定向(它将Location HTTP响应标头发送回客户端,并导致浏览器从外部重定向到新URL-浏览器地址栏中的URL更改。)

附加说明:在这种情况下,由于您正在请求“产品”,并且存在具有 basename 的文件(实际上,这是您要重写的文件) ),还需要确保禁用MultiViews(默认情况下)。如果启用了MultiViews(某些共享主机出于某种原因启用了此功能),则mod_negotiation将触发product.php的内部子请求。 之前,您的mod_rewrite指令将重写该请求,并且它将丢失{ {1}} URL参数。 (SO上的许多重写问题是由与MultiViews的冲突引起的。)要禁用id,可以在MultiViews文件的顶部添加此内容:

.htaccess

更通用

要使其更通用,并将Options -MultiViews 重写为/product/<number>是1个或多个数字的/product.php?id=<number>,可以修改正则表达式(第一个参数)并创建 backreference (您在 substitution 字符串(第二个参数)中使用)。例如:

<number>

这会将格式# Internally rewrite a request from "/product/<number>" RewriteRule ^product/(\d+)$ /product.php?id=$1 [L] 的URL重写为/product/123。其中/product.php?id=123是1个或多个数字,由正则表达式子模式123表示。 (\d+是速记字符类,与稍稍冗长的\d相同。[0-9]量词,它指示1个或多个前面的模式-在这种情况下为数字。)通过将其括在括号中,我们创建一个捕获组,我们可以在 substitution 中引用该组。这就是+后向引用。 $1本质上是一个变量,其中包含捕获的正则表达式的任何 value

总结:

$1

参考: