2015-08-26 136 views
3

所以我一直在尋找,現在有一陣子,無法找到具體如何在未發送一切的index.php文件或感動的事情到子文件夾創建一個漂亮的URL/SEO /塞URL類型系統任何東西。.htaccess/PHP的URL重寫沒有路由?

基本上我正在做一個網站,您目前可以去像movie.php?ID = ####/show.php?ID =網址####。理想情況下,我希望網址是電影/ ####或電影/ ID/####(或沿着我可以用來抓取正確的名字的線段)等。

有沒有辦法做到這一點,沒有一個單一的index.php路由器,或者我只是將不得不重寫所有的文件,以堅持這種風格?

回答

4

您可以創建在.htaccess的路由電影的網址movie.php如下重寫規則:

電影/ 123:

RewriteRule ^movie/(\d+)$ movie.php?id=$1 [L] 

電影/ ID/123:

RewriteRule ^movie/id/(\d+)$ movie.php?id=$1 [L] 

電影/標題-的-電影:

RewriteRule ^movie/(\S+)$ movie.php?slug=$1 [L] 

電影/標題/標題-的-電影:

RewriteRule ^movie/title/(\S+)$ movie.php?slug=$1 [L] 

組合影片/ 123 /標題-的-電影:

RewriteRule ^movie/(\d+)/(\S+)$ movie.php?id=$1&slug=$2 [L] 

編輯:加入全htaccess的例子爲1如果URL不適用於電影,則最多需要2個額外的可選參數,並在index.php上有一個備用參數。

Options -Indexes 
IndexIgnore */* 

Options FollowSymLinks 
AddDefaultCharset utf-8 

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    RewriteRule ^movie/([^/]+)/?([^/]*)/?([^/]*)$ movie.php?param1=$1&param2=$2&param3=$3 [L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-l 
    RewriteRule . index.php [L] 
</IfModule> 

^從頭匹配
$匹配,直到結束
?爲0或1發生
+ 1個或多個
*爲0或多次出現

如果url規則不匹配,文件不存在,那麼它會將url路由到index.php,但是您可以刪除最後一部分如果你不想那樣。

+0

我試過其中的一些,但沒有工作。你能提供完整的「塊」嗎?我喜歡動態的方式而不是通配符方式,因爲有些頁面會允許更多的變量。另外我該如何解釋選項參數?如果一個頁面最多可以有3個參數,但最小值是1?我需要單獨的規則嗎?謝謝! :) – jkingaround

+0

我添加了一個完整的.htaccess示例。這些規則考慮了例如電影/第一/第二/第三從開始到結束。如果你在「電影」之前有一個url部分,你還需要將它添加到規則中,或者在開始時省略'^'。 – JonathanStevens

0

是,假設你的URL結構遵循一個比較一致的模式,你絕對可以使用.htaccess文件和mod_rewrite的(不需要的index.php文件,通常被稱爲前端控制器)做到這一點。

這裏是一個非常簡單的例子:

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.*)/(.*)$ $1.php?id=$2 [NC,L] 

這需要一個輸入URL等http://example.com/movie/3並執行透明/內部重寫(因此用戶不會看到URL變化)到http://example.com/movie.php?id=3

當然,這個例子可以擴展到處理更多的參數,等等。但希望這可以讓你開始在正確的道路上。我強烈建議你閱讀mod_rewrite的文檔瞭解更多信息:http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html