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

Правило перезаписи .htaccess не работает

У меня очень простое правило перезаписи, но оно не работает.

у меня есть следующее:

#old see edits for newer versions
RewriteCond %{HTTP_REFERER}           ^localhost:8080(/|$)
RewriteRule ^/downloads/.*  /somePackage/index.php?id=5  [NC,C]
RewriteRule ^/downloads   /somePackage/index.php?id=2  [NC,L]

кажется, что он не проходит RewriteCond, Почему это так?

когда я пробую это:

RewriteRule downloads/?    /somePackage/index.php?id=2 [NC,L]

кажется, работает для localhost:8080/downloads

но когда я пытаюсь:

RewriteRule downloads/.*/?    /somePackage/index.php?id=5 [NC,L]

это не работает, почему это не работает? что мне делать вместо этого?

редактировать:

я это текущий код, который работает только для localhost:8080/downloads и localhost:8080/downloads/ но не когда я добавляю что-то после косой черты

RewriteRule downloads/somedownload/?  /somePackage/index.php?id=5  [NC,L]
RewriteRule downloads/?   /somePackage/index.php?id=2  [NC,L]

редактировать 2:

вот код .htaccess, используемый для этого.

# Only the URLs /downloads and /downloads/ (with and without trailing slash)
RewriteRule ^downloads/?$ /somePackage/index.php?id=2 [NC,L]

#gives 404 - Category not found
RewriteRule ^downloads/ignis_desktop$ /somePackage/index.php?id=5 [NC,L]

# Everything else that starts /downloads/<something>
RewriteRule ^downloads/. /somePackage/index.php?id=5 [NC,L]

Кажется, я не могу найти решение проблемы 404.

однако с [r=301] кажется, что он правильно перенаправляет на страницу, но нарушает цель перезаписи: сделать URL причудливым.

я нашел решение своей проблемы,

я изменил rewrite к этому:

RewriteRule ^downloads/somedownload$ /somepackage/index.php?option=com_content&view=article&id=5

хотя в моем меню я могу ссылаться на такие страницы:

localhost:8080/home

и он перепишет его так:

RewriteRule ^home/?    /somepackage/index.php?id=1   [L,NC]

HTTP_REFERER (если установлен) - это абсолютный URL, начинающийся со схемы. например.

http://localhost:8080/....

Итак, CondPattern Такие как ^localhost:8080(/|$) никогда не совпадет.

Отметим также, что RewriteCond директивы применяются только к одиночным RewriteRule далее следует, но не все из них, как, кажется, подсказывает ваш первый пример кода.

RewriteRule ^/downloads   /somePackage/index.php?id=2  [NC,L]

А RewriteRule шаблон Такие как ^/downloads (т.е. путь URL, начинающийся с косой черты) никогда не будет совпадать в каждом каталоге .htaccess файлы. В .htaccess files, префикс каталога сначала удаляется из URL-пути перед сопоставлением с шаблоном. Итак, это должно быть ^downloads чтобы соответствовать всем URL-адресам, начинающимся с /downloads.

RewriteRule downloads/.*/?    /somePackage/index.php?id=5 [NC,L]

Это не будет соответствовать localhost:8080/downloads так как шаблон требуется косая черта в конце.

ОБНОВИТЬ:

я хочу localhost:8080/downloads идти в id=2 и localhost:8080/downloads/somedownload идти в id=5 и localhost:8080/downloads/anotherdownload идти в id=6 однако для вопроса я сжал его до /downloads/<everything-else> перейти к id=5

Я предполагаю /downloads является не физический каталог в файловой системе. В этом случае следует использовать привязку конца строки ($) на RewriteRule шаблон, или будьте осторожны с порядком, в котором вы размещаете эти директивы (т. е. сначала самые конкретные).

Попробуйте следующее:

# Only the URLs /downloads and /downloads/ (with and without trailing slash)
RewriteRule ^downloads/?$ /somePackage/index.php?id=2 [NC,L]

# Everything else that starts /downloads/<something>
RewriteRule ^downloads/. /somePackage/index.php?id=5 [NC,L]

Спорный вопрос, стоит ли ловить оба /downloads и /downloads/ - в идеале должно быть то или иное.

Чтобы перехватить определенный URL (например, /downloads/somedownload), тогда это нужно будет перед правило «Все остальное ...»:

RewriteRule ^downloads/somedownload$ /somePackage/index.php?id=5 [NC,L]