Привет, ТАК, я пытаюсь использовать модуль apache mod_rewrite, чтобы выполнить базовое переписывание URL-адреса на моем веб-сайте, чтобы они стали немного более удобными для SEO
в основном у меня есть файл виртуального хоста, который выглядит так
<VirtualHost *:80>
ServerAdmin morrison.brendan17@gmail.com
ServerName mind-knowledge.com
ServerAlias www.mind-knowledge.com
DocumentRoot /var/www/tagmenu
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/tagmenu>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule /video/([0-9]+) /PlayVideo/index.php?videoID=13424
</IfModule>
</Directory>
</VirtualHost>
теперь, насколько я понимаю, правило перезаписи должно разрешать http://www.mind-knowledge.com/PlayVideo/13424/
будет отображаться как страница http://www.mind-knowledge.com/PlayVideo/index.php?videoID=13424
это верно?
Сейчас я получаю 404, и я пробежал sudo a2enmod rewrite
и перезагрузил apache.
Может ли кто-нибудь помочь мне в том, что я делаю неправильно, или предложить способы устранения проблемы, заранее спасибо. Брендан
Вы хотите /PlayVideo/13424/
работать, но первая часть вашего правила перезаписи /video/
.
Вы также не используете числа, указанные в первой части, во второй части, что означает, что все будут всегда смотреть одно и то же видео, независимо от номера в их URL-адресе.
Измените его на это, чтобы исправить обе эти проблемы:
RewriteRule /PlayVideo/([0-9]+) /PlayVideo/index.php?videoID=$1
Я должен был заметить это раньше, но есть еще две проблемы. Во-первых, ваши правила перезаписи находятся внутри <Directory>
блок, и это меняет их работу. Самый простой способ объяснить это - убрать начальную косую черту.
Более технически точное описание состоит в том, что путь, который передается в правило перезаписи, которое необходимо сопоставить, является путем файловой системы, а не URI, и у него удален каталог с его начала.
Итак, внутри <Directory>
block следует использовать:
RewriteRule PlayVideo/([0-9]+) PlayVideo/index.php?videoID=$1
Другое дело второстепенное, но я предпочитаю не иметь <IfModule>
блокировать вообще. Они удобны для тех, кто сопровождает пакеты, чьи конфигурации будут развернуты на тысячах разных машин людьми любого уровня подготовки, но для одного развертывания с (возможно) одним администратором все, что они делают, это скрывают другие ошибки. Если вы забыли загрузить модуль перезаписи (закомментировал строку, удалил символическую ссылку и т. , прямо как вы видите. Без <IfModule>
block, эта же ошибка может привести к тому, что Apache не запустится, и появится полезное сообщение об ошибке.
Хотя это возможно, мой мозг плохо справляется с регулярным выражением, поэтому я склонен больше разделять вещи. Хотя на стороне apache он работает медленнее, я предпочитаю что-то большее, например:
RewriteBase /PlayVideo
RewriteCond %{REQUEST_URI} ^/([0-9]+)$
RewriteRule ^(.*) index.php?video=$1 [L,QSA]
QSA не является обязательным, но в будущем вы, возможно, захотите передать больше строк запроса. Это дает вам такую возможность.
Также, если у вас есть доступ к журналам, установите следующее (только во время отладки!): RewriteLogLevel 4
Затем просмотрите журналы, чтобы увидеть, в какой момент правило перезаписи сделало что-то не то, что вы ожидали.