簡體   English   中英

使用 PHP 和 .htaccess (mod_rewrite) 管理 slug

[英]Manage slugs with PHP and .htaccess (mod_rewrite)

讓我們調用我的網站:

www.example.com

我有一個像這樣的 PHP 文件:

www.example.com/product.php?id=50

我想通過使用訪問它

www.example.com/product/50

但同樣,非常重要,我有幾個子目錄,比如

www.example.com/subsite/product.php?id=50
www.example.com/subsubsite/product.php?id=50

那必須變成

www.example.com/subsite/product/50
www.example.com/subsubsite/product/50

如何使用 mod_rewrite 使用 PHP 和.htaccess最好地解決它? 我用其他類似問題敲了敲頭,但無濟於事。

我似乎找不到完美運行的解決方案,處理所有導入的文件,如 CSS、JS 和 PHP 類。

好的,所以這可能不是完整的答案,但應該可以幫助您找到自己的方式。

您可以使用正則表達式來匹配您想要的路徑模式。 因此,例如,您的 htaccess 可能看起來像...

# Check if module is installed
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /

# Check query for matching pattern and pass id, but also append additional query strings
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\/]+\/)?product\/([0-9]+)$ /$1product.php?id=$2 [L,QSA]

# If not file or directory on server, send to 404.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /404.php [L]

</IfModule>

而它的作用是......

1.將uri與正則表達式匹配

正則表達式: ^([^\/]+\/)?product\/([0-9]+)$

  1. ^ - 字符串的開始。
  2. ([^\/]+\/)? - 匹配任何目錄(如果存在)並將其存儲以供重用。
  3. product\/([0-9]+) - 您想要的路徑,例如product/50並存儲數字“id”以供重復使用。
  4. $ - 字符串結束。

2. 將捕獲的目錄和 id 傳遞給我們的文件

像這樣:/ /$1product.php?id=$2 [L,QSA]

  1. $1是我們的目錄名稱,包括尾部斜杠,例如subsubsite/
  2. $2是我們的產品編號,例如50
  3. [L,QSA] QSA 標志意味着我們可以訪問其他查詢字符串參數,例如/product/50?show=all&updated=1 更多關於標志的信息可以在這里找到http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa

3. 404 不匹配

像這樣:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /404.php [L]
  1. !-f如果請求不是文件
  2. !-d如果請求不是目錄
  3. /404.php用於顯示 404 錯誤的文件。

拿到身份證...

通過以上,您可以在product.php文件中獲取 ID,如下所示:

$id = (int)$_GET[ 'id' ];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM