Я переношу веб-сайт со старого сервера, который отключается, на новый, и в процессе у меня возникают проблемы с Apache и mod_rewrite. У меня есть следующий файл .htaccess:
RewriteEngine on
RewriteRule ^audio/(.*?)/.*?$ audio.php?id=$1
RewriteRule ^books/(.*?)/.*?$ books.php?id=$1
Audio.php и books.php вызываются, как ожидалось, за исключением того, что захваченные переменные не передаются, поэтому в случае rewriterule audio.php мне предоставляется страница audio.php, но $_GET
пусто.
Чтобы проверить, что происходит, я добавил RewriteRule (.*) test.php?a=$1
где test.php только что сбросил $_GET
когда я сделал это $_GET['a']
содержит test.php.
В журнале ошибок ничего не отображается, и поскольку правильные файлы обслуживаются, очевидно, что перезапись в основном работает, а в конфигурации AllowOverride All
Что я делаю не так?
Я хочу прояснить, что этот файл htaccess работал так же, как и на старом сервере.
Вам следует настроить RewriteLog
с высоким RewriteLogLevel
чтобы ваши правила обрабатывались так, как вы ожидаете.
Имейте в виду, что .*?
может дать пустое совпадение, потому что *
средства 0 или больше. По крайней мере, вы можете захотеть использовать +
(так, .+?
), что значит один или больше.
Anyhoo. Есть лучшие способы выразить то, что вы ищете.
Чтобы соответствовать до следующей косой черты, это должно делать:
RewriteRule ^audio/([^/]+) /audio.php?id=$1
Хотя, если это числовой идентификатор, можно уточнить:
RewriteRule ^audio/(\d+) /audio.php?id=$1
Это действительно будет зависеть от того, что вы будете делать после этого. Какой путь передается к исходному запросу? Всегда ли это / audio / some_id / other_stuff? Какая еще есть конфигурация для путей со словом "audio"? Для запроса формы:
http://www.example.com/audio/some_id/other_stuff
вам, вероятно, понадобится RewriteRule:
ReWriteRule ^/audio/(.*)/.*$ /audio.php?id=$1
Я думаю .*? не делаете то, что хотите. Дайте ему кружиться и посмотрите, что он сделает. Вы также можете найти справочное руководство по регулярным выражениям Perl полезно.