Включить доступный для человека URL-адрес в .htaccess
Предисловие: Да, этот вопрос кажется дублированным, и я нашел связанные вопросы, но ответы оттуда не помогли мне.: (
Здравствуйте, я хочу добавить поддержку читаемых URL-адресов для моего PHP-проекта. На данный момент строка запроса URL выглядит так:
index.php?url=main/index
Я хотел бы сделать так:
index.php/main/index
Я читаю следующие статьи:
qaru.site/info/500454/...
Cheatsheet
qaru.site/info/500454/...
qaru.site/info/500454/...
Но когда я это делаю:
var_dump($_GET['url']); // get empty array
получите пустой массив, например, не добавлен параметр url.
Мой текущий .htaccess
:
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ index.php?url=$1 [NC]
Может кто-нибудь мне помочь? Спасибо!
Ответы
Ответ 1
URL: http://domain.com/index.php/controller/action
Переписанный URL: http://domain.com/index.php?url=controller/action
.htaccess
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^index.php/(.*)$ /index.php?url=$1 [L,QSA]
Пояснение:
.*
в шаблоне ^index.php/(.*)$
соответствует всем после index.php/
по входящему URL. Скобки помогают захватить часть как переменную $1
, которая затем добавляется в конце URL-подстановки /index.php?url=
+ $1
.
[L, QSA]
:
L игнорировать другие правила перезаписи, если это подходит.
QSA означает добавление строки запроса.
Ответ 2
У вас есть
index.php?url=main/index
Юо хочет переписать (а затем перенаправить пользователя) на этот
index.php/main/index
Как насчет этого?
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^url=([a-z]+)/([a-z]+)$
RewriteRule ^.*$ http://mydomain.site/index.php/%1/%2 [R=302,L]
R = 301 или 302 зависит от вашей потребности
В этом примере я предположил, что на исходном url есть только символы a-z.
Просто чтобы уточнить (из-за того, что в целом процесс обратный), таким образом пользователи будут перенаправлены, эти правила не преобразуют ссылки на вашу страницу.
Ответ 3
В строке
RewriteRule ^(.*)$ index.php?url=$1 [NC]
(. *) соответствует части URL-адреса до '?' где начинается запрос.
Чтобы использовать значения, переданные в запросе, вам нужен флаг QSA. Добавляет строку запроса.
Ответ 4
Попробуйте приведенный ниже код, Только для индекса .php вы можете заменить его согласно вашему требованию. Дайте мне знать, если вам нужна дополнительная помощь.
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine ON
RewriteBase /
RewriteRule ^(index\.php)/([0-9a-zA-Z\/_-]{1,99}) index.php?url=$2
Что сработало для меня:
<?php var_dump($_GET); ?>
Это единственное, что я сделал на url http://localhost/baba.php/abcd
. и оригинальный файл .htaccess
DirectoryIndex baba.php
RewriteEngine ON
RewriteBase /
RewriteRule ^(baba\.php)*/([0-9a-zA-Z\/_-]{1,99}) baba.php?url=$2
Ответ 5
Если ваш URL: www.abcd.com/index.php/abcd/...
.htaccess
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Ответ 6
Пожалуйста, попробуйте это, я думаю, решит вашу проблему, если вы используете этот код.
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php