在URL重写后保留GET变量

时间:2013-09-27 13:07:10

标签: 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.***********.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]从“#RELOVE PHP EXTENSIONS”上方移到了RewriteBase下面,它似乎解决了我的问题。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

L-flag将停止重写此循环。因此它永远不会达到

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

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

答案 1 :(得分:1)

最有可能的问题是在您的第一条规则中未使用 L标记。喜欢这样:

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