У меня очень простое правило перезаписи, но оно не работает.
у меня есть следующее:
#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]