example.com/cat1/cat2/?page=3 的重写规则

问题描述 投票:0回答:1

我想创建一个能够捕获以下内容的网页: http://example.com/category_name/subcategory_name/ 与它一起服务 http://example.com/page.php?label1=category_name&label2=subcategory_name&page=1

我创建了以下 RewriteRule 并且它有效

RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2&page=1 [L]

现在我想抓住 http:// example .com/category_name/subcategory_name/?page=number 与它一起服务 http://example.com/page.php?label1=category_name&label2=subcategory_name&page=number

我创建了以下两个 RewriteRules 但它不起作用

RewriteRule ^([^/]+)/([^/]+)/?page=([^/]+) /page.php?label1=$1&label2=$2&page=$3 [L]
RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2&page=1 [L]

服务器始终显示“page=1”的内容。我做错了什么?

apache mod-rewrite pagination seo
1个回答
0
投票
RewriteRule ^([^/]+)/([^/]+)/?page=([^/]+) /page.php?label1=$1&label2=$2&page=$3 [L]
RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2&page=1 [L]

您无法使用

RewriteRule
pattern(第一个参数)来匹配查询字符串。这仅与 URL 路径匹配。

您不需要显式传递页面“查询字符串”,因为默认会传递查询字符串,您只需确认是否存在(或不存在)

page
查询字符串。尽管您需要
QSA
标志将查询字符串 append 到您在 substitution 字符串中创建的字符串。

如果您不需要任何其他 URL 参数,那么您可以执行如下操作:

RewriteCond %{QUERY_STRING} ^page=\d+$ 
RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2 [QSA,L]
RewriteCond %{QUERY_STRING} ^$ 
RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2&page=1 [L]

请注意,第二条规则检查是否存在查询字符串(即没有

page
URL 参数),否则存在 any 查询字符串将触发相同的规则。

或者,可以将这些组合成一个规则(避免重复):

RewriteCond %{QUERY_STRING} ^page=(\d+)$ [OR]
RewriteCond %{QUERY_STRING}@1 ^@(.)$ 
RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2&page=%1 [L]

此规则捕获

page
URL 参数的值(第一个条件),或者如果查询字符串为空(第二个条件),则默认为
1
。然后,捕获的“页码”将在带有 %1 反向引用的
substitution
字符串中使用。

或者,如果省略,您可以在应用程序 (PHP) 代码中默认

page
URL 参数的值,并简单地传递请求的查询字符串(无论它可能包含什么)。这只需要一个简化的规则:

RewriteRule ^([^/]+)/([^/]+)/$ /page.php?label1=$1&label2=$2 [QSA,L]

注意

QSA
标志,它将附加(合并)初始请求中出现的任何查询字符串。尽管这不会“验证”URL(留给应用程序)。例如。 /category_name/subcategory_name/?foo=1&page=2&bar=3 是允许的。
    

© www.soinside.com 2019 - 2024. All rights reserved.