Управляйте слагами с помощью PHP и .htaccess (mod_rewrite) - PullRequest
0 голосов
/ 05 августа 2020

Назовем мой сайт:

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

Как я могу решить это в лучшем случае с помощью PHP и .htaccess используя mod_rewrite? Я забил себе голову другими вопросами вроде этого , но безрезультатно.

Кажется, я не могу найти решение, которое работает безупречно, заботясь обо всех импортированных файлах, таких как CSS , JS и PHP классы.

1 Ответ

1 голос
/ 05 августа 2020

Хорошо, так что это может быть не полный ответ, но он должен помочь вам найти свой путь.

Вы можете использовать регулярное выражение для соответствия желаемому шаблону пути. Так, например, ваш 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 с шаблоном регулярного выражения

Regex: ^([^\/]+\/)?product\/([0-9]+)$

  1. ^ - начало строки.
  2. ([^\/]+\/)? - соответствует любому каталог (если существует) и сохраняет его для повторного использования.
  3. product\/([0-9]+) - желаемый путь, например, product/50, и сохраняет номер «id» для повторного использования.
  4. $ - конец строка.

2. Передайте захваченный каталог и идентификатор в наш файл

Примерно так: /$1product.php?id=$2 [L,QSA]

  1. $1 - это имя нашего каталога, включая завершающий sla sh например 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 = (int)$_GET[ 'id' ];
...