2015-06-12 89 views
2

.htaccess是這樣的:的.htaccess修改重寫規則,但保留所有其他規則不變

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/


RewriteRule page/sitemap /sitemap.php 
RewriteRule music/(.*) /music.php?slug=$1 
RewriteRule results/(.*) /results.php?q=$1 
RewriteRule list/(.*)/(.*) /list.php?letter=$1&page=$2 

預期其工作。

當我撥打<a href="/page/sitemap">Sitemap</a>時,它調用sitemap.php,我有一個漂亮的URL。

<a href="/music/pop">Pop</a>相同的方式它叫music.php?slug=pop也是一個漂亮的URL。

問題是關於music/(.*) /music.php?slug=$1規則;我想刪除音樂,所以我可以有mysite.com/pop作爲最終的URL而不是mysite.com/music/pop但保留所有其他規則。

如果我嘗試:

RewriteRule (.*) /music.php?slug=$1 

這是行不通的,因爲我影響所有電話,但不知道如何,或者是否有可能有我想要的方式。

希望我能解釋一下我的問題,謝謝!

回答

1

這應該爲你工作:

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteRule ^page/sitemap$ /sitemap.php [END] 
RewriteRule ^results/(.+)$ /results.php?q=$1 [END] 
RewriteRule ^list/(.+)/(.+)$ /list.php?letter=$1&page=$2 [END] 

RewriteRule ^(.*)$ /music.php?slug=$1 [END] 

使用[L]國旗在我身邊似乎會導致內部服務器錯誤 - 不知道這是爲什麼。使用END標誌修復它。

已將(.*)更改爲(.+)(不包括音樂規則)以使其匹配1個或多個字符 - 如果您不想要該行爲,則可以將其更改回以使其匹配0或更多。

本質上,這裏發生了什麼:我們首先檢查具體的重寫。如果這些不匹配,則將所有內容發送到music.php。任何其他具體的規則都應該以相同的格式添加到音樂規則的上方。

更新:根據您的評論,上述衝突與index.php重寫和現有的文件。作爲替代,您應該通過(.*)index.php並讓該文件執行music.php的目的。不幸的是,你不能有兩個相同的重寫模式的規則。見下面(包括允許更改CSS/JS文件等):

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteRule ^page/sitemap$ /sitemap.php [END] 
RewriteRule ^results/(.+)$ /results.php?q=$1 [END] 
RewriteRule ^list/(.+)/(.+)$ /list.php?letter=$1&page=$2 [END] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php?slug=$1 [L] 
+0

嗨邁克,感謝您的答覆。有想法,但因爲一切都會被髮送到music.php,如果我沒有聲明之前,我有問題: index.php 和所有.css文件,.js文件和我調用的圖像。 並從其他目錄調用其他例程的其他php文件。 認爲它們都落在最後的規則(music.php)中,所以也許事情可能會更復雜一點。 感謝您的任何建議,你可以給。 –

+0

我看到了 - 你沒有提及任何有關'index.php'文件的內容。不幸的是,你不能兼得。如果需要,您必須將其他所有內容發送到'index.php'並獲取*音樂*。我會更新我的答案以反映這一點。 –

+0

謝謝你的支持,Mike! –