修改htaccess文件后获取请求不起作用

时间:2018-11-24 14:06:01

标签: .htaccess get request

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。

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-不仅仅是不存在任何值。