У меня есть URL http://localhost/index.php?user=1
. Когда я добавляю этот файл .htaccess
Options +FollowSymLinks RewriteEngine On RewriteRule ^user/(.*)$ ./index.php?user=$1
Теперь мне будет разрешено использовать ссылку http://localhost/user/1
. Но как насчет http://localhost/index.php?user=1&action=update
как я могу сделать это в http://localhost/user/1/update
?
Также как я могу сделать этот URL http://localhost/user/add
? Благодарю. Извините, я относительно новичок в .htaccess
.
вы можете написать что-то вроде этого:
RewriteEngine On RewriteRule ^([^/]*)/([^/]*)$ /index.php?user=$1&action=$2 [L]
Если вы хотите повернуть
http://www.yourwebsite.com/index.php?user=1&action=update
в
http://www.yourwebsite.com/user/1/update
Вы можете использовать
Options +FollowSymLinks RewriteEngine On RewriteRule ^user/([0-9]*)/([az]*)$ ./index.php?user=$1&action=$2
Чтобы увидеть параметры в PHP:
<?php echo "user id:" . $_GET['user']; echo "<br>action:" . $_GET['action']; ?>
Это, на мой взгляд, немного более чистое и безопасное, чем (. *), Что в основном означает, что почти все принимается.
Поскольку вы отметили это с помощью PHP, я добавлю небольшую перспективу из того, что я сделал, и это может или не поможет вам.
Вы, конечно, можете писать исключительно в .htaccess, заботясь о порядке. Например, предположим, что у вас есть:
RewriteRule ^user/([0-9]+)/update$ ./index.php?user=$1&action=update RewriteRule ^user/([0-9]+)$ ./index.php?user=$1
Затем он должен, после получения
http://localhost/user/1/update
идти к
http://localhost/index.php?user=$1&action=update
и не
http://localhost/index.php?user=$1
Теперь я сделал то же самое, что и index.php?q=$1
RewriteRule ^(.*)$ index.php?q=$1
Затем я использовал index.php для обработки разрыва запроса. Итак, скажем, кто-то входит
http://www.example.com/user/18239810/update
это пойдет
http://www.example.com/index.php?q=user/18239810/update
Оттуда взорвите строку запроса по первому /
чтобы дать user
и 18239810/update
.
Это скажет мне, что мне нужно передать 18239810/update
на user
контроллер. В этом контроллере я снова взорву аргумент в идентификатор пользователя и команду, и я могу включить команду, чтобы рассказать, как загрузить страницу, передав идентификатор пользователя в качестве аргумента функции update
.
Очень быстрый и грязный пример (index.php):
<?php $getString = explode('/', $_GET['q'], 1); $controller = $getString[0].'Controller'; require_once('/controllers/'.$controller.'.php'); $loadedController = new $controller( $getString[1] ); ?>
Конечно, это означает, что все конструкторы должны принимать строковый аргумент, который будет анализироваться для допустимых значений. Вы можете сделать это с помощью взрывающихся и переключающих операторов, всегда возвращающихся на стандартную переднюю страницу, чтобы предотвратить несанкционированный доступ на основе случайных догадок.
Спасибо за идею @denoise и @mogosselin. Также с @stslavik для указания некоторых недостатков моего примера кода.
Вот как я это делаю:
Options +FollowSymLinks RewriteEngine On RewriteRule ^user/([0-9]*)/([az]*)$ ./index.php?user=$1&action=$2 RewriteRule ^user/([az]*)$ ./index.php?user&action=$1
с помощью var_dump($_GET);
по ссылке localhost/user/1234/update
я получил
array (size=2) 'user' => string '1234' (length=4) 'action' => string 'update' (length=3)
в то время как localhost/user/add
array (size=2) 'user' => string '' (length=4) 'action' => string 'update' (length=3)
это моя цель. Я просто буду делать другие вещи под капотом с помощью PHP.
Для /user/add
вам нужно будет сделать отдельное правило, потому что у вас нет «среднего параметра». Так:
RewriteRule ^user/add$ ./index.php?action=add [L,QSA]
Затем вы можете выполнить дополнительные правила для URL-адресов, содержащих дополнительные параметры:
RewriteRule ^user/([0-9]+)/([A-Za-z]+)$ ./index.php?user=$1&action=$2 [L,QSA]
Это позволит вам выполнять действия с существующими пользователями. Например /user/1/update
простой способ – передать только один variabe в index.php, как это
Options +FollowSymLinks RewriteEngine On RewriteRule ^(.*)$ index.php?data=$1 [QSA]
и в вашем файле index.php вы делаете это
$data = expload("/",$_GET['data']); $user = $data[1]; $action = $data[2];
это работает для всех случаев, когда вы пытаетесь передать много переменных, это не работает в wase, когда вы делаете что-то вроде
http://localhost/user/add/12/54/54/66
последняя переменная всегда принимает значение add/12/54/54/66
Просто попробуйте это!
Options +FollowSymLinks RewriteEngine On RewriteRule ^game/([0-9]+)/([_-0-9a-zA-Z]+)/?$ index.php?user=$1&action=$2 [L,NC]
Это оно !!
Попробуйте это очень просто:
Options +FollowSymLinks RewriteEngine on RewriteRule index/user/(.*)/(.*)/ index.php?user=$1&action=$2 RewriteRule index/user/(.*)/(.*) index.php?user=$1&action=$2