2012-12-12 48 views
0

我與我的.htaccess規則有級聯問題。考慮以下幾點:爲什麼我的.htaccess規則不起作用?

RewriteEngine on 

RewriteRule ^product/(.*)$ product.php [L,QSA] 
RewriteRule ^(.*)$   index.php [L] 

通過上述,如果我請求一個URL像http://example.com/product/product-slug,那麼我期望請求路由到產品.php。但是,它沒有;我的index.php腳本被挑選出來了。

我本來以爲第一RewriteRule將被匹配,因爲它有一個L(最後)標誌沒有進一步RewriteRule s就匹配,包括了「一攬子」一個在底部。

爲什麼這不像預期的那樣工作?

回答

2

這應該對它進行排序:

RewriteRule ^product/(.*)$ product.php [L,QSA] 

RewriteCond %{REQUEST_FILENAME} !product.php 
RewriteRule ^.*$ index.php [L] 

的問題是,因爲規則是在不同的組,即不附加了一個條件,它只是停止處理當前的規則集(第一個)和躍升到第二個。

希望清除它所有:)

1

也許你的代碼中有一個錯字?您在您的問題中編寫了「http://example.com/products/」,但在您要編碼的代碼^product$中沒有。

另外,你的第一條規則太嚴格了。它只會匹配http://example.com/product/。你需要在產品後加入一張通配符,以便它能夠拾取product-slug。像RewriteRule ^products/(.*)$ product.php [L,QSA]應該工作。

+1

不幸的是,這些似乎並不是罪魁禍首。我已經刪除了錯字並添加了通配符(我錯過了),但**/product/test **的請求仍然傳遞給** index.php **。 –

+0

您需要爲規則設置一個條件,使其符合以下條件:'RewriteCond%{HTTP_HOST}!^ www.domain.com $ [NC]'。 –

0

這不是因爲您將規則放在了什麼位置嗎?下面的內容將覆蓋對它上面的更改。嘗試改變它們。

另外,你需要設置RewriteBase嗎?您的項目是在實際的域上,還是在本地存儲在服務器根目錄的子目錄中?

+1

正如我所說,我認爲只要符合最高規則,'L'國旗就會停止尋找比賽,儘管? –