Назад | Перейти на главную страницу

начало работы с apache mod_rewrite на виртуальном хосте

Привет, ТАК, я пытаюсь использовать модуль 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

Затем просмотрите журналы, чтобы увидеть, в какой момент правило перезаписи сделало что-то не то, что вы ожидали.