У меня очень простое правило перезаписи, однако он не работает.
у меня следующее:
#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]
, это не работает, почему это не работает? что мне делать вместо этого?
edit:
i это текущий код, который работает только для 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]
edit 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 причудливым.
Я нашел решение моей проблемы,
Я изменил перезапись
на это:
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
префикс каталога сначала удаляется из 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 / загрузок / anotherdownload
, чтобы перейти кid = 6
, однако для вопроса, который я сжал до/ downloads /
, перейдите к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]