2013-09-27 60 views
0

我尝试重写我的产品页面的URL这是动态保持GET URL后变量改写

中的一个例子是:

product.php?id=780-1AC930D 

和我试着将它改写为:

产品/ 780-1AC930D

我需要变量仍然通过网址,但目前它不适用于我。

我在的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]从“#删除PHP扩展”到RewriteBase低于以上,它似乎解决我的问题。

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

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

+0

你已经做过任何调试了吗?什么是错误信息? –

+0

我没有收到错误消息。它只是重定向我,因为IF语句表明$ _GET ['id']不存在然后重定向。如果我把这个重定向出来然后它只是加载一个空白产品页面 – Kevlar

+0

只是为了排除错别字,缓存重定向等,你看到'var_dump($ _ GET)'? – Brad

回答

3

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

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

L标志将停止重写此周期。因此,它从来没有达到过

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

this documentation有关标志的信息和this documentation关于一般mod_rewrite的更多信息。

+0

这条规则不应该从'RewriteCond%{REQUEST_FILENAME} -f [OR] '规则在它之前。 – anubhava

+0

这是有道理的,并且可以解释为什么将它移动到顶部修复它 – Kevlar

+0

@anubhava该条件适用于'RewriteRule^- [L]'。另外'product/asdf'很可能不是一个文件,只是一个奇特的URL。 @Kevlar它匹配并执行从顶部到底部的规则,并将通过'.htaccess'直到url不再改变。 – Sumurai8

1

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

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

将我的标志更改为您的建议。该线仍然在顶部一切正常工作好了,现在谢谢 – Kevlar

+0

有用的信息。最好始终将顶部的'%{REQUEST_FILENAME} -f [OR]'规则保留在顶部,以便即使在添加新规则后也能避免发生类似事故。 – anubhava