【问题标题】:Get request not working after modifying htaccess file修改 htaccess 文件后获取请求不起作用
【发布时间】:2018-11-24 14:06:00
【问题描述】:
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;
}

我正在使用在 URL 上解析的页面(如 product.php?page=)获取页面。但是,当我将 URL 更改为 /product/page/6 后访问 GET 请求时,它没有获得第二页。第一个页面正在工作,因为默认值为 1。

【问题讨论】:

    标签: .htaccess get request


    【解决方案1】:
    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= - 请参阅下面的注释

    您确定需要第二个RewriteRule 上的NC 标志吗?除非您有规范标签,否则这可能会创建“重复上下文”。 (我首先删除了它,因为您已经在正则表达式中直接检查大写/小写。)

    if (isset($_GET['page'])) {
        $Product_page = $_GET['page'] ;
    }
    else {
        $Product_page = 1;
    }
    

    您似乎信任page URL 参数的值。如上所述,这可以合法地为空,因此对于任何 invalid 值也应默认为 1 - 而不仅仅是当它根本不存在时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多