【问题标题】:keeping GET variables after URL rewrite在 URL 重写后保留 GET 变量
【发布时间】:2013-09-27 13:07:10
【问题描述】:

我正在尝试重写我的动态产品页面 URL

一个例子是:

product.php?id=780-1AC930D

我正在尝试将其重写为:

产品/780-1AC930D

我需要该变量仍然通过 URL 传递,但目前它对我不起作用。

我在product.php 页面顶部有一个重定向,如下所示:

$prodID = $_GET['id'];
    if(!isset($prodID) && $prodId == ""){
        header( 'Location: http://www.***********.com' ) ;
    }       
    else{

我知道 GET 变量没有通过,因为它一直在重定向我。

HTACCESS 文件的代码是这样的:

 Options FollowSymLinks
RewriteEngine On
RewriteBase / 
RewriteRule ^product/(.*)$ /product.php?id=$1 [QSA]

URL 的 HTML 是:

<a href = "product/<?php echo $product[$i]['catID'];?>">

有人知道为什么这不起作用吗?

编辑以提供更多信息。

这是我的整个 HTACCESS 文件

Options FollowSymLinks
RewriteEngine On
RewriteBase / 

RewriteRule ^product/(.*)$ /product.php?id=$1 [QSA]

## If the request is for a valid directory
RewriteCond %{REQUEST_FILENAME} -d [OR]

## If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]

## If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l

## don't do anything
RewriteRule ^ - [L]
RewriteRule ^([^/.]+)/([^/]+)/?$ /$1.php?cat=$2 [L,QSA]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.php\?cat=([^\s&]+)&subCat=([^\s&]+)\s [NC]
RewriteRule ^ /%1/%2/%3? [R=301,L]

RewriteRule ^([^/.]+)/([^/]+)/([^/]+)/?$ /$1.php?cat=$2&subCat=$3 [L,QSA]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.php\?cat=([^\s&]+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]


# REMOVE PHP EXTENSIONS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]

我刚刚将 RewriteRule ^product/(.*)$ /product.php?id=$1 [QSA] 从“# REMOVE PHP EXTENSIONS”上方移动到 RewriteBase 下方,它似乎解决了我的问题。

其他重写规则适用于我的类别和子类别页面,然后才真正进入产品页面。

所以我很好奇为什么将这个 product.php 行放在其他东西之上呢?

【问题讨论】:

  • 您是否已经进行了任何调试?错误信息是什么?
  • 我没有收到错误消息。它只是重定向我,因为 IF 语句指出如果 $_GET['id'] 不存在然后重定向。如果我取消该重定向,那么它只会加载一个空白的产品页面
  • 只是为了排除拼写错误、缓存重定向等等,您对var_dump($_GET) 有什么看法?
  • var_dump($_GET);给我 "array(1) { ["cat"]=> string(11) "780-1AC930D" }" 但是 var_dump($_GET['id']);给我“NULL”
  • 问题是你的重写规则RewriteRule ^product/(.*)$ /product.php?id=$1实际上是RewriteRule ^product/(.*)$ /product.php?cat=$1。也许您的其他重写规则之一有错误导致这种情况,而不是具体的。

标签: php regex .htaccess url


【解决方案1】:

问题是在您要匹配的规则之前,另一个规则与请求匹配。在这种情况下,与您的请求匹配的规则是:

RewriteRule ^([^/.]+)/([^/]+)/?$ /$1.php?cat=$2 [L,QSA]

L 标志将停止此周期的重写。因此它从未达到

RewriteRule ^product/(.*)$ /product.php?id=$1 [QSA]

有关标志的信息,请参阅this documentation,有关 mod_rewrite 的更多信息,请参阅this documentation

【讨论】:

  • 这条规则不应该被执行,因为RewriteCond %{REQUEST_FILENAME} -f [OR]规则在它之前。
  • 这是有道理的,可以解释为什么将它移到顶部会修复它
  • @anubhava 该条件适用于RewriteRule ^ - [L]product/asdf 也很可能不是一个文件,只是一个花哨的 url。 @Kevlar 它从上到下匹配并执行规则,会遍历.htaccess,直到url不再变化。
  • 没错,但它来自/product.php?id=asdf,这实际上是一个文件。
  • @anubhava /product.php?cat=asdf(它变成了)无论如何都不会匹配 ^product/(.*)$,所以即使 OP 会删除该规则,它也无法解决问题。 OP 期望匹配并执行 product 规则,但由于规则冲突,它永远不会达到该规则。 RewriteCond %{REQUEST_FILENAME} -f 没有参与其中,不是在 OP 移动 product 规则之前,也不是在他移动它之后,如果 OP 删除该规则,也会发生完全相同的事情。
【解决方案2】:

最可能的问题是在您的第一条规则中没有使用 L 标志。像这样:

RewriteRule ^product/(.+)$ /product.php?id=$1 [QSA,NC,L]

【讨论】:

  • 将我的标志更改为您的建议。这条线仍在顶部,现在一切正常,谢谢
  • 很高兴知道。最好将%{REQUEST_FILENAME} -f [OR]规则始终放在最前面,这样即使添加了新规则,也可以避免此类事故。
猜你喜欢
  • 2013-01-04
  • 2023-03-03
  • 2016-05-08
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2012-09-28
  • 2014-06-05
相关资源
最近更新 更多