Почему Apache mod_rewrite не работает должным образом - PullRequest
0 голосов
/ 18 декабря 2008

Я хочу перенаправить URL-адреса со старого сайта, который использовал необработанные URL-запросы, на мой новый сайт, который я реализовал в CodeIgniter. Я просто хочу перенаправить их на мою страницу индекса. Я также хотел бы избавиться от «index.php» в моих URL, чтобы мои URL были такими же простыми, как example.com/this/that. Итак, это .htaccess файл, который я создал:

RewriteEngine on
Options FollowSymLinks

RewriteBase /

RewriteCond $1 ^assets
RewriteRule ^(.*)$ example/production/$1

RewriteCond %{QUERY_STRING} .+
RewriteRule ^(.*)$ index.php? [R=301]

RewriteCond $1  !^(index\.php|example|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 

Следует также отметить, что мой index.php фактически является символической ссылкой на example/production/index.php.

Теперь, первое правило работает как положено - все мои стили и изображения отображаются очень хорошо, это вторые два правила, с которыми у меня проблемы. Второе правило заключается в том, чтобы уничтожить строку запроса и перенаправить на мою страницу индекса (внешне). Итак, я нашел это в руководстве Apache:

Примечание: строка запроса

Шаблон не будет сопоставлен со строкой запроса. Вместо этого вы должны использовать RewriteCond с переменной% {QUERY_STRING}. Однако вы можете создавать URL-адреса в строке подстановки, содержащей часть строки запроса. Просто используйте знак вопроса внутри строки замещения, чтобы указать, что следующий текст должен быть повторно введен в строку запроса. Если вы хотите стереть существующую строку запроса, завершите строку подстановки только знаком вопроса. Чтобы объединить новую строку запроса со старой, используйте флаг [QSA].

Однако, когда я пытаюсь получить доступ к одной из старых страниц, вместо перенаправления на мою страницу индекса, я получаю ошибку 404 страница не найдена. Я нашел обходной путь, сделав его внутренним перенаправлением, но мне бы очень хотелось, чтобы он был внешним.

Следующая проблема, которая больше всего меня озадачила, связана с третьим правилом. Я ожидаю, что это сделать что-то вроде следующего. Если я наберу:

http://example.com/this/thing

Я бы ожидал, что он перенаправит на

http://example.com/index.php/this/thing

К сожалению, это не работает. Вместо этого, независимо от того, что я печатаю, он всегда перенаправляет на мою индексную страницу, как будто ничего не было в URL (он просто идет к http://example.com/).

Более того, и это еще больше сбивает меня с толку, если я заменю это правило следующим:

RewriteCond $1 !^(index\.php|example|robots\.txt)
RewriteRule ^(.*)$ index.php/this/thing

Если я введу URL-адрес, такой как http://example.com/other/thing, то он перейдет к http://example.com/index.php/this/thing, как и ожидалось, НО, если я наберу http://example.com/this/thing, он перейдет к http://example.com/ (моя страница индекса). Я не могу сделать из этого головы или хвосты. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 18 июня 2009

хммм - похоже, это тоже не работает. Проблема в том, что мои URL не запрашивают имя файла или каталог. Например: example.com/index.php/this/thing должен вызывать метод 'thing' контроллера 'this'. - Стивен Оксли

Условие таково: если запрос НЕ является файлом, а НЕ каталогом, так что это было правильно, что вам нужно было сделать, это добавить в строку запроса:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
1 голос
/ 18 декабря 2008

Это должно решить вашу проблему с index.php и просто определить, доступен ли robots.txt:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...