Например, я хочу изменить:
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, он просто ломает все и дает мне массу ошибок
используя это правило RewriteRule ^([^\.]+)$ $1.php [NC,L], вы в основном превращаете www.example.com/forum/thread/1/hello в www.example.com/forum/thread/1/hello.php, вам нужно лучшее регулярное выражение, чтобы удалить ".php" из URL-адреса и передать ваши аргументы, как вы хотите
Я не понимаю. Перезапись URL обычно происходит наоборот.
Я обнаружил, что с этого веб-сайта, и до сих пор всякий раз, когда я добавлял .php в конец URL-адреса, он удаляет его @Kaddath
файл находится в папке с названием forum, внутри корня, и я не использую RewriteBase @NicoHaase
@TheWelshManc Я протестировал ваши правила перезаписи в локальной среде. для меня они работают. Есть ли в вашем .htaccess дополнительные правила перезаписи? Может быть, применяется другое правило? Вы проверяли перезапись журнала?
"масса ошибок" А что это за ошибки? Это может указывать на то, что вы, по крайней мере, действительно добираетесь до нужного файла.
Он переходит в файл а, но не в файл в, теперь он думает, что самый конец URL-адреса - это файл .php, а не бит потока






В своем вопросе вы заявляете, что хотите изменить:
от 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
В приведенном выше примере у вас есть $ 1.php. Это добавит .php к любой первой переменной в вашем правиле перезаписи. Вы хотите убедиться, что в правиле перезаписи вы указываете страницу php, на которую должны перейти (например, thread.php), а затем назначать переменные переменным php. (например, id = $ 1 & topic = $ 2).
Да, в моем коде это сказано, это почти то же самое, но вы добавили косую черту и вопросительный знак.
Вы удалили другое правило, добавляющее .php?
Да, я использую этот RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^/?thread/([0-9]+)/([0-9a-zA-Z_-]+) /thread.php?id=$1&topic=$2 только сейчас
Просто чтобы попробовать, можно убрать условия перезаписи? Убедитесь, что механизм перезаписи включен: RewriteEngine on Затем просто введите свое правило: RewriteRule ^ /? Thread / ([0-9] +) / ([0-9a-zA-Z _-] +) /thread.php ? id = $ 1 & topic = $ 2 Затем, чтобы убедиться, что он не кэширован в браузере, попробуйте открыть окно браузера в режиме инкогнито и перейти на свою страницу?
Страница все еще загружается, но я все еще получаю ошибки, когда css не загружается, или какие-либо сценарии, поскольку он пытается искать их внутри каталога потока, даже если поток является файлом, а не каталогом.
Позвольте нам продолжить обсуждение в чате.
Ваше правило никогда не будет применено, потому что вы используете 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]
Не сработало, все предложения не работают
В какой папке вы сохранили этот файл? Вы используете
RewriteBase?