2012-08-10 44 views
1

我很難開始使用mod_rewrite。我一直在這裏約一小時谷歌搜索的東西,但似乎沒有任何工作。我想要做的就是改變
example.com/species.php到example.com/species

example.com/species.php?name=frog到example.com/species/frog。Mod_Rewrite到/子目錄和/子目錄/查詢

使用

Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^species/(.*)$ /species.php?name=$1 

我能得到example.com/species.php?name=frog顯示爲example.com/species/frog,並與

RewriteRule ^species/ /species.php 

我可以得到例如.com/species.php顯示爲example.com/species/,但我無法讓他們兩人同時工作。
此外,沒有結尾斜槓的example.com/species總是以404的形式出現。
我認爲只是讓一個/種類/目錄來解決任何問題,但我寧願只有一個物種的一些規則.php文件。任何幫助將很樂意被讚賞!

編輯(因爲我不能回答我自己8個多小時的問題):

我似乎有固定我的兩個問題。我改變了我的.htaccess到:

Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^species/(.*)$ /species.php?name=$1 
RewriteRule ^species/?$ /species.php 

第二重寫規則成功地重定向example.com/species,同時使其他重寫規則,同時努力example.com/species.php。
但是,如果我在example.com/species/中輸入了斜線,則它將被讀爲example.com/species.php?name=,並且會因爲沒有提交名稱而引發錯誤,所以我只是添加了

if(isset($_GET['name']) && empty($_GET['name'])) {header('location: http://example.com/species');} 

因此,如果我使用example.com/species/,它會重定向到/物種並按需要工作。

回答

1

如果你在第一次重寫規則改變*(匹配零個或多個)的+(匹配一個或多個),那麼你應該再看到species.php?name=如果使用尾隨斜線。

這是因爲+將要求某些東西出現在斜線後面,否則規則將不匹配。然後你的第二個RewriteRule將匹配,因爲它以可選的斜槓結束,但不會將name=查詢字符串添加到目標URL。

您可能還希望在第一條規則後添加[L]標誌(上一個),因爲如果第一條規則匹配,則不需要執行第二條規則。 (請注意,這不會停止的RewriteCond重寫規則和試驗正在對所產生的重定向URL,這將不得不通過.htaccess文件就像任何其他的要求運行。)

Reference Documentation for mod_rewrite in Apache 2.4(或查看的文檔你實際使用的Apache版本)。