PHP URL Rewrite - нет получения параметра строки запроса - PullRequest
3 голосов
/ 21 марта 2020

Я работаю над сайтом и одновременно учу PHP, поэтому он для меня относительно новый. В настоящее время я работаю над перезаписью URL, однако не могу получить желаемый результат.

Я пытаюсь изменить: example.com/CMS/listing?id=1 на example.com/CMS/listing/1.

Использование файла .htaccess в файлах root у меня есть следующее:

RewriteEngine On
RewriteBase /
RewriteRule CMS/listing/([0-9]+) CMS/listing.php?id=$1

И на сайте у меня есть простая функция echo, которая получает параметр строки запроса для id. Когда я перехожу на example.com/CMS/listing?id=1, функция отображает 1, однако, когда я go на example.com/CMS/listing/1, она ничего не показывает. Я что-то упускаю или делаю неправильно?

# Get QString Param
$id = $_GET["id"];
echo $id;

Сноска

.htaccess содержится в root, а listing.php находится в пределах папка с именем CMS.

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Похоже, у вас конфликт с MultiViews. Вы должны отключить MultiViews вверху вашего .htaccess файла:

Options -MultiViews

Если MultiViews включено, то когда вы запрашиваете /CMS/listing/1, mod_negotiation отобразит запрос на /CMS/listing.php (добавление расширение файла, без каких-либо параметров URL) до ваша директива mod_rewrite способна обработать запрос. (/1 рассматривается как дополнительная информация о пути или PATH_INFO в URL.)

URL-адрес, подобный /CMS/listing?id=1 (без расширения файла), будет работать, только если включен MultiViews , В этом случае строка запроса уже присутствует в URL.

0 голосов
/ 21 марта 2020

Вы также можете перенаправить весь трафик c до индекса. php и обработать все это в PHP. Вот как обычно это делают другие CMS и фреймворки.

Это подход Laravel - вам не нужно делать это таким образом, но позже, когда вы захотите создавать собственные URL-адреса в новостной ленте или любое другое, вы должны установить новые правила. Таким образом, вы можете просто добавить их в базу данных и создать некий обработчик маршрута. Если вы хотите сохранить простоту, вы можете просто создать в базе данных таблицу, в которой хранятся URL-адреса, и поле для вызываемого файла.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
...