2013-07-29 52 views
0

我遇到了URL重寫問題。.htaccess文件中的多個重寫規則

這是我的.htaccess文件看起來像:

<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteRule ^blog\/$ /blog.php [L] 
RewriteRule ^blog\/[a-zA-Z0-9\-]+\/([0-9]+)-([0-9]+)\/$ /blog.php?action=listposts&categoryid=$1&page=$2 [L] 
RewriteRule ^blog\/featured\/([0-9]+)\/$ /blog.php?action=listposts&categoryid=featured&page=$1 [L] 
RewriteRule ^blog\/[a-zA-Z0-9\-]+\/([0-9]+)\/[a-zA-Z0-9\-]+\/$ /blog.php?action=viewpost&postid=$1 [L] 
</IfModule> 

我不知道爲什麼,但它不能正常工作。例如,當我轉到像blog/my-category/1-5/這樣的網址並打印出$_GET時,它沒有任何鍵,就好像我在網址blog/上一樣。 對不起這個問題,因爲它很可能是一個重複的,但我真的不知道該怎麼做,我想我不明白這個問題是基於解決別人的問題。

回答

1

Rules are processed in the order其中遇到(自上而下)。你也在逃避一些不需要轉義的東西。 -括號內的連字符[]最後不需要轉義。如果他們之間的事物被視爲範圍(例如,[0-9])。不需要轉義斜線/,但有時可能不需要斜線(取決於您的設置),所以我添加了?字符以使其不總是必需的。

RewriteEngine on 
RewriteBase/

RewriteRule ^blog/[a-zA-Z0-9-]+/([0-9]+)-([0-9]+)/?$ /blog.php?action=listposts&categoryid=$1&page=$2 [L] 
RewriteRule ^blog/featured/([0-9]+)/?$ /blog.php?action=listposts&categoryid=featured&page=$1 [L] 
RewriteRule ^blog/[a-zA-Z0-9-]+/([0-9]+)/[a-zA-Z0-9-]+/?$ /blog.php?action=viewpost&postid=$1 [L] 
RewriteRule ^blog/?$ /blog.php [L] 

如果你已經使用在PHP中preg_功能,可能是在您的斜線逃脫的習慣是從作爲網上很多例子和書使用/字符作爲分隔符來了。

+0

對於我的「逃避習慣」,你很可能是對的。感謝您修復我的重寫命令,他們現在正在工作,但他們這樣做只有當我重定向到的文件不被稱爲'blog.php'。任何方式在這個?我想這必須與我的Apache配置有關... –

+0

@MatejGolian可能有一個RewriteCond的某處說'%{REQUEST_FILENAME} -f'。這將是它後面的規則之一,告訴他們重定向到默認文件。 –

+0

不幸的是,在.htaccess文件中沒有這樣的命令。我發佈的代碼是它包含的所有代碼。但我注意到,如果我在地址欄中鍵入'asd'或'asd /'或'asd/anything',並且在我的.htaccess文件所在的目錄中有一個名爲'asd.php'的文件,我獲取'asd.php'的內容。它與Options + FollowSymlinks或其他相關嗎?我想這就是爲什麼我不能將請求重定向到'blog.php'。 –