Перепишите переменные PHP из URL-адреса с помощью .htaccess

Например, я хочу изменить:

www.example.com/forum/thread?id=1&topic=hello

к

www.example.com/forum/thread/1/hello

Я осмотрелся и изменил свой файл .htacess, чтобы он выглядел так, чтобы изменить эти URL-адреса.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^thread/([0-9]+)/([0-9a-zA-Z_-]+) thread.php?id=$1&topic=$2 [NC,L]

Я все время получаю ошибку 404 о том, что файл не существует. Мне интересно, это потому, что я сначала удаляю .php из файла, используя это:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Но затем, когда я удаляю это правило и перехожу к thread.php? Id = 1 & topic = hello, он просто ломает все и дает мне массу ошибок

В какой папке вы сохранили этот файл? Вы используете RewriteBase?

Nico Haase 13.12.2018 16:22

используя это правило RewriteRule ^([^\.]+)$ $1.php [NC,L], вы в основном превращаете www.example.com/forum/thread/1/hello в www.example.com/forum/thread/1/hello.php, вам нужно лучшее регулярное выражение, чтобы удалить ".php" из URL-адреса и передать ваши аргументы, как вы хотите

Kaddath 13.12.2018 16:23

Я не понимаю. Перезапись URL обычно происходит наоборот.

yivi 13.12.2018 16:24

Я обнаружил, что с этого веб-сайта, и до сих пор всякий раз, когда я добавлял .php в конец URL-адреса, он удаляет его @Kaddath

TheWelshManc 13.12.2018 16:24

файл находится в папке с названием forum, внутри корня, и я не использую RewriteBase @NicoHaase

TheWelshManc 13.12.2018 16:40

@TheWelshManc Я протестировал ваши правила перезаписи в локальной среде. для меня они работают. Есть ли в вашем .htaccess дополнительные правила перезаписи? Может быть, применяется другое правило? Вы проверяли перезапись журнала?

Steffen Mächtel 13.12.2018 16:43

"масса ошибок" А что это за ошибки? Это может указывать на то, что вы, по крайней мере, действительно добираетесь до нужного файла.

Patrick Q 13.12.2018 16:46

Он переходит в файл а, но не в файл в, теперь он думает, что самый конец URL-адреса - это файл .php, а не бит потока

TheWelshManc 13.12.2018 16:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
540
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В своем вопросе вы заявляете, что хотите изменить:

от www.example.com/forum/thread?id=1&topic=hello до www.example.com/forum/thread/1/hello

Однако это наоборот.

Адрес, который вы перезаписываете в к, должен быть адресом, который может интерпретировать сервер. Итак, www.example.com/forum/thread/1/hello должен быть "дружественным" адресом, который вводит пользователь, а при перезаписи добавлять должно быть расширение .php (хотя при перезаписи это не будет видно пользователю в адресная строка)

Попробуй это:

RewriteEngine on RewriteRule ^/?thread/([0-9]+)/([0-9a-zA-Z_-]+) /thread.php?id=$1&topic=$2

Причина, по которой вы, вероятно, получаете ошибки при переходе на thread.php, заключается в том, что у вас есть правило для удаления .php (который теперь сервер не сможет отобразить страницу). С помощью приведенного выше правила перезаписи вы получите его, перейдя по ссылке: www.something.com/thread/1/hello

Предыдущий RewriteRule работает, но теперь он думает, что поток - это каталог, а не файл .php, он думает, что привет - это файл .php

TheWelshManc 13.12.2018 16:49

В приведенном выше примере у вас есть $ 1.php. Это добавит .php к любой первой переменной в вашем правиле перезаписи. Вы хотите убедиться, что в правиле перезаписи вы указываете страницу php, на которую должны перейти (например, thread.php), а затем назначать переменные переменным php. (например, id = $ 1 & topic = $ 2).

Vlnflt 13.12.2018 16:53

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

TheWelshManc 13.12.2018 16:55

Вы удалили другое правило, добавляющее .php?

Vlnflt 13.12.2018 16:57

Да, я использую этот RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^/?thread/([0-9]+)/([0-9a-zA-Z_-]+) /thread.php?id=$1&topic=$2 только сейчас

TheWelshManc 13.12.2018 16:59

Просто чтобы попробовать, можно убрать условия перезаписи? Убедитесь, что механизм перезаписи включен: RewriteEngine on Затем просто введите свое правило: RewriteRule ^ /? Thread / ([0-9] +) / ([0-9a-zA-Z _-] +) /thread.php ? id = $ 1 & topic = $ 2 Затем, чтобы убедиться, что он не кэширован в браузере, попробуйте открыть окно браузера в режиме инкогнито и перейти на свою страницу?

Vlnflt 13.12.2018 17:00

Страница все еще загружается, но я все еще получаю ошибки, когда css не загружается, или какие-либо сценарии, поскольку он пытается искать их внутри каталога потока, даже если поток является файлом, а не каталогом.

TheWelshManc 13.12.2018 17:03

Позвольте нам продолжить обсуждение в чате.

Vlnflt 13.12.2018 17:03

Ваше правило никогда не будет применено, потому что вы используете RewriteCond %{REQUEST_FILENAME}\.php -f, это условие проверяет вашу файловую систему, чтобы увидеть, существует ли /forum/thread/1/hello.php, и если это не так, ваше правило игнорируется. Просто закомментируйте или удалите это условие из своего правила.

Пытаться :

RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{REQUEST_FILENAME}\.php -f
 RewriteRule ^thread/([0-9]+)/([0-9a-zA-Z_-]+) thread.php?id=$1&topic=$2 [NC,L]

Не сработало, все предложения не работают

TheWelshManc 13.12.2018 18:08

Другие вопросы по теме