#.htaccess #mod-rewrite
#.htaccess #мод-перезапись
Вопрос:
Я хочу следующее поведение:
http://www.example.com/mysubdir -> show /mysubdir/index.htm
http://www.example.com/mysubdir/first -> show /mysubdir/redirect.php?token=first
http://www.example.com/mysubdir/first/second -> show /mysubdir/redirect.php?token=firstamp;action=second
http://www.example.com/mysubdir/first/second/third -> show /mysubdir/redirect.php?token=firstamp;action=secondamp;param=third
поэтому я создал следующий .htaccess (внутри mysubdir)
RewriteEngine on
RewriteBase /mysubdir/
RewriteRule ^([^/] )/([^/] )/([^/] )/? ./redirect.php?token=$1amp;action=$2amp;param=$3 [L]
RewriteRule ^([^/] )/([^/] )/? ./redirect.php?token=$1amp;action=$2 [L]
RewriteRule ^([^/] )/? ./redirect.php?token=$1 [L]
Это приводит к ошибке 500
Однако, если я удалю последнюю строку, первые два правила будут работать так, как ожидалось. Я не вижу никакой видимой разницы между этими правилами, которая должна вызывать такую ошибку.
Ответ №1:
Вы получаете 500 (внутренняя ошибка сервера), потому что ваши правила бесконечно повторяются из-за наличия [^/]
в вашем последнем правиле, которое также будет соответствовать переписанному URI redirect.php
.
Вы можете исправить это с помощью этого измененного кода:
RewriteEngine on
RewriteBase /mysubdir/
# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^([^/] )/([^/] )/([^/] )/?$ redirect.php?token=$1amp;action=$2amp;param=$3 [L,QSA]
RewriteRule ^([^/] )/([^/] )/?$ redirect.php?token=$1amp;action=$2 [L,QSA]
RewriteRule ^([^/] )/?$ redirect.php?token=$1 [L,QSA]
Внесены еще несколько изменений:
- Используется
QSA
для сохранения любой существующей строки запроса в URL-адресах. - Вы должны использовать привязку
$
в своих шаблонах регулярных выражений. - Нет необходимости экранировать
/
шаблоны регулярных выражений.
Комментарии:
1. отсутствие сохранения каких-либо параметров на самом деле является желательным поведением. Спасибо за решение этой проблемы и дополнительную информацию
2. хорошо, в этом случае вы можете пропустить
QSA
флаг для удаления строки запроса, отправленной с вашими красивыми URL-адресами.