RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)$ product-detail.php?asin=$1 [L,NC]
RewriteRule ^product product.php [L,NC]
RewriteRule ^product/page/([0-9]+)$ product.php?page=$1 [L,NC]
上面的.htaccess
为什么会影响我的GET请求?
if (isset($_GET['page'])) {
$Product_page = $_GET['page'] ;
}
else {
$Product_page = 1;
}
我正在使用在product.php?page=
之类的URL上解析的页面来获取页面。但是,当我将URL更改为/product/page/6
后访问GET请求时,没有得到第二页。第一页有效,因为默认值为1。
答案 0 :(得分:0)
RewriteRule ^product product.php [L,NC]
我很惊讶这不会导致重写循环吗? (但这可能取决于配置的其余部分。例如,您是否启用了MultiViews
?)
这会捕获所有开始 /product
并重写为/product.php
的请求。因此,/product/page/6
被重写为/product.php
,并且页码丢失了。顺便说一下,第一个/product
也会捕获对RewriteRule
的请求,将请求重写为product-detail.php?asin=product
?!另外,如果您确实启用了MultiViews
,那么这也会发生冲突。
您可以改为执行以下操作:
Options -MutliViews
RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)$ product-detail.php?asin=$1 [L]
RewriteRule ^product(?:/page/([0-9]+))?$ product.php?page=$1 [L,NC]
这结合了两个规则,并使URL的/page/<n>
部分为可选。这将导致重写为product.php?page=
-请参见下面的说明。
确定要在第二个NC
上使用RewriteRule
标志吗?除非您有规范的标签,否则这可能会创建“重复的上下文”。 (我首先删除了它,因为您已经在正则表达式中直接检查了大小写)。
if (isset($_GET['page'])) { $Product_page = $_GET['page'] ; } else { $Product_page = 1; }
您似乎在信任page
URL参数的值。如上所述,此值可以合法为空,因此对于任何无效值,也应默认为1
-不仅仅是不存在任何值。