Ошибка 500 в RewriteRule

#.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]
  

Внесены еще несколько изменений:

  1. Используется QSA для сохранения любой существующей строки запроса в URL-адресах.
  2. Вы должны использовать привязку $ в своих шаблонах регулярных выражений.
  3. Нет необходимости экранировать / шаблоны регулярных выражений.

Комментарии:

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

2. хорошо, в этом случае вы можете пропустить QSA флаг для удаления строки запроса, отправленной с вашими красивыми URL-адресами.