2013-09-27 108 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