Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php URL重写后保留GET变量_Php_Regex_.htaccess_Url - Fatal编程技术网

Php URL重写后保留GET变量

Php URL重写后保留GET变量,php,regex,.htaccess,url,Php,Regex,.htaccess,Url,我试图重写我的产品页面的网址是动态的 一个例子是: product.php?id=780-1AC930D 我正试图将其改写为: 产品编号/780-1AC930D 我需要变量仍然通过URL,但目前它不适合我 我在product.php页面顶部有一个重定向,如下所示: $prodID = $_GET['id']; if(!isset($prodID) && $prodId == ""){ header( 'Location: http://www.*****

我试图重写我的产品页面的网址是动态的

一个例子是:

product.php?id=780-1AC930D
我正试图将其改写为:

产品编号/780-1AC930D

我需要变量仍然通过URL,但目前它不适合我

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

$prodID = $_GET['id'];
    if(!isset($prodID) && $prodId == ""){
        header( 'Location: http://www.***********.com' ) ;
    }       
    else{
RewriteRule ^product/(.+)$ /product.php?id=$1 [QSA,NC,L]
我知道GET变量没有通过,因为它一直在重定向我

我拥有的HTACCESS文件代码如下:

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

<a href = "product/<?php echo $product[$i]['catID'];?>">
我刚刚将
RewriteRule^product/(.*)$/product.php?id=$1[QSA]
从“#删除php扩展名”的上方移动到RewriteBase的下方,它似乎解决了我的问题

其他重写规则适用于“我的类别”和“子类别”页面,然后才实际将其添加到产品页面


因此,我很好奇为什么将product.php行放在其他内容之上就可以了?

问题是,在您想要匹配的规则之前,有其他规则匹配了请求。在这种情况下,符合您请求的规则是:

RewriteRule ^([^/.]+)/([^/]+)/?$ /$1.php?cat=$2 [L,QSA]
L标志将停止此循环的重写。因此,它从未到达

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

有关标志的信息以及有关mod_rewrite的更多信息,请参阅。

问题在于,在您想要匹配的规则之前,有另一个规则匹配了请求。在这种情况下,符合您请求的规则是:

RewriteRule ^([^/.]+)/([^/]+)/?$ /$1.php?cat=$2 [L,QSA]
L标志将停止此循环的重写。因此,它从未到达

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

有关标志的信息以及有关mod_rewrite的更多信息,请参阅。

最可能的问题是在第一条规则中未使用标志。这样做:

$prodID = $_GET['id'];
    if(!isset($prodID) && $prodId == ""){
        header( 'Location: http://www.***********.com' ) ;
    }       
    else{
RewriteRule ^product/(.+)$ /product.php?id=$1 [QSA,NC,L]

最可能的问题是在第一条规则中未使用
L
标志。这样做:

$prodID = $_GET['id'];
    if(!isset($prodID) && $prodId == ""){
        header( 'Location: http://www.***********.com' ) ;
    }       
    else{
RewriteRule ^product/(.+)$ /product.php?id=$1 [QSA,NC,L]


你已经调试过了吗?什么是错误消息?我没有收到错误消息。它只是重定向我,因为IF语句声明如果$\u GET['id']不存在,那么重定向。如果我将重定向取出,它只会加载一个空白的产品页面,以排除输入错误、缓存重定向等,您会看到
var\u dump($\u GET)
?var\u dump($\u GET);给我“array(1){[“cat”]=>string(11)“780-1AC930D”}”,但变量为dump($\u GET['id']);给我“NULL”问题是您的重写规则
RewriteRule^product/(.*)$/product.php?id=$1
实际上是
RewriteRule^product/(.*)$/product.php?cat=$1
。也许您的另一个重写规则中有一个错误导致了这种情况,与此相反。您已经调试过了吗?什么是错误消息?我没有收到错误消息。它只是重定向我,因为IF语句声明如果$\u GET['id']不存在,那么重定向。如果我将重定向取出,它只会加载一个空白的产品页面,以排除输入错误、缓存重定向等,您会看到
var\u dump($\u GET)
?var\u dump($\u GET);给我“array(1){[“cat”]=>string(11)“780-1AC930D”}”,但变量为dump($\u GET['id']);给我“NULL”问题是您的重写规则
RewriteRule^product/(.*)$/product.php?id=$1
实际上是
RewriteRule^product/(.*)$/product.php?cat=$1
。可能是您的另一个重写规则中有一个错误导致了这种情况,与此相反。由于
RewriteCond%{REQUEST\u FILENAME}-f[或]
规则就在它前面。这是有道理的,可以解释为什么要将它移到顶部it@anubhava该条件适用于
重写规则^-[L]
。另外,
product/asdf
很可能不是一个文件,只是一个花哨的url@Kevlar它从上到下匹配并执行规则,并将通过
.htaccess
,直到url不再更改。是的,但它是
/product.php?id=asdf
,实际上是一个文件。@anubhava
/product.php?cat=asdf
(它变成了)无论如何都不会匹配
^product/(.*)
,因此,即使OP删除了该规则,也无法解决问题。OP希望匹配并执行
产品
规则,但由于规则冲突,它永远不会到达该规则
RewriteCond%{REQUEST\u FILENAME}-f
与此无关,不是在OP移动
产品
规则之前,也不是在他移动它之后,如果OP删除了该规则,同样的事情也会发生。由于
RewriteCond%{REQUEST\u FILENAME}-f[或]
规则就在它前面。这是有道理的,可以解释为什么要将它移到顶部it@anubhava该条件适用于
重写规则^-[L]
。另外,
product/asdf
很可能不是一个文件,只是一个花哨的url@Kevlar它从上到下匹配并执行规则,并将通过
.htaccess
,直到url不再更改。是的,但它是
/product.php?id=asdf
,实际上是一个文件。@anubhava
/product.php?cat=asdf
(它变成了)无论如何都不会匹配
^product/(.*)
,因此,即使OP删除了该规则,也无法解决问题。OP希望匹配并执行
产品
规则,但由于规则冲突,它永远不会到达该规则
RewriteCond%{REQUEST_FILENAME}-f
在其中没有起作用,不是在OP移动
产品
规则之前,也不是在他移动它之后,如果OP删除该规则,同样的事情也会发生。将我的标志更改为您的建议。由于这条线仍然在顶部,现在一切正常,谢谢你知道。最好将
%{REQUEST\u FILENAME}-f[或]
规则始终保持在顶部,这样即使在添加新规则后也可以避免类似的事故。已将我的标志更改为您的建议。由于这条线仍然在顶部,现在一切正常,谢谢你知道。是b