Как я могу заставить mod_rewrite переписать все?

1

То, что я пытался достичь, - это заставить мой файл.htaccess переписать ВСЕ URL.

Однако независимо от того, что я делаю, я не могу игнорировать существующие каталоги. И я имею в виду, действую так, как будто их не существует.

Например, скажем, у меня есть следующая файловая структура:

/
    dir1
        file1.php
    dir2
        file2.php
    .htaccess

И предположим, что я хочу перенаправить весь трафик на dir1/file1.php?url=path.

Это никогда не работает для меня, если путь является существующим каталогом.

Например, если я перехожу к url/path/stuff/dir2, работает "перенаправление", но URL-адрес в адресной строке изменяется на url/path/stuff/dir2/?url=dir2 по какой-то непостижимой причине.

Вот мой .htaccess:

Options -MultiViews

Options -Indexes

Options +FollowSymLinks

# so navigating to a url with a trailing slash won't cause problems
DirectorySlash Off

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ dir1/file1.php?url=$1 [QSA,L]
  • 1
    Вы показали нам все свои .htaccess? У вас есть строка, которая выглядит примерно так: RewriteCond% {REQUEST_FILENAME}! -F В таком виде ваш .htaccess должен зацикливаться бесконечно.
  • 1
    @BareNakedCoder Ах! Это объясняет многие вещи, которые я не понимал. Но я добавил проверку, и она по-прежнему не меняет поведение. (Я редактировал вопрос, хотя.)
Показать ещё 4 комментария
Теги:
.htaccess
mod-rewrite

1 ответ

0

Вы (обновлено).htaccess говорит: IF (это не существующий файл) THEN {перепишите URL}. Похоже, вы хотите

RewriteEngine on
RewriteCond %{REQUEST_URI} !dir1/file1.php
RewriteRule ^(.*)$ dir1/file1.php?url=$1 [QSA,L]

В этом случае RewriteCond просто предотвращает бесконечный цикл. RewriteRule применяется один раз и только один раз. Модуль перезаписи будет циклически перемещаться по всем правилам, пока цикл не приведет к изменению URI.

  • 0
    Да спасибо. Это также проясняет ситуацию. Но основная проблема все еще сохраняется: переход к path/dir2 приводит к изменению адресной строки на path/dir2/?url=dir2 а я не хочу, чтобы она менялась. (Он все еще «показывает» dir1/file1.php , так что это хорошо.)
  • 0
    Вы пробовали это? Перезапись с использованием url = dir2 выполняется только для Apache и не должна отображаться в адресной строке браузера (если только вы на самом деле не перенаправляете на нее, чего у вас нет, поскольку у вас нет [QSA, L, R]) , Все фреймворки используют этот трюк для вызова своих интерфейсных контроллеров для первоначальной обработки запросов всех форм.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню