2009-05-08 4 views
2

Я хочу запросы на мой сайт, чтобы работать следующим образом:Apache мод переписать простое перенаправление

http://example.com/ будет тянуть вверх файл index.php (текущее поведение по умолчанию) в идеале без отображения index.php

http://example.com/foo.php будет тянуть до foo.php, как можно было бы ожидать

http://example.com/blerg будет перенаправлять http://example.com/bar.php?code=blerg

у меня есть следующие правила перезаписи прямо сейчас

RewriteRule ^/(.*\.(php|html|htm|css|jpg))$ /$1 [NC,L] 
    RewriteRule ^/(.*)$ /bar.php?code=$1 [NC,L] 

, который работает почти, кроме http://example.com/ тянет bar.php вместо index.php

В идеале я бы не должны иметь все возможные расширения файла в первом правиле, я бы скорее всего обнаружить если это фактический файл.

+0

Действительно хороший вопрос, хотел сделать это сам на некоторое время. – barfoon

+0

Это произойдет в файле conf conf сервера, поскольку файлы .htaccess попадают в каждый запрос. «blerg» выше - переменная, я не пытаюсь ее сопоставить, я пытаюсь сопоставить все, что было после первоначальной косой черты. – borkencode

ответ

1

Найдено решение, которое работает

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/([^.]+)$ /bar.php?code=$1 [QSA,L] 
 
http://example.com/ directs to index.php properly (without showing index.php) 
http://example.com/abc directs to bar.php?code=abc 
http://example.com/foo.php operates normally. 
0

Предполагая, что это находится в .htaccess, а не файл conf apache, theres no/находится в первой части правила перезаписи. Так что если вы хотите отобразить:

http://example.com/blah.jpg

вы:

RewriteRule ^blah\.jpg$ /some_other_file.jpg [L] 

Обратите внимание на отсутствие ведущего/и маскирование периода в противном случае он совпадает с любым символом (например, без (.) это, правило будет соответствовать blahxjpg).

Также, если вы перенаправляете что-то, что в противном случае является каталогом, вы можете обнаружить, что клиент или сервер ставят конечную косую черту. Для этого я обычно делаю это:

RewriteRule ^directory/?$ /some_other_directory/index.php [L] 

или аналогичный.

Этот последний пункт относится к:

RewriteRule ^/(.*)$ /bar.php?code=$1 [NC,L] 

В принципе изменить его:

RewriteRule ^/?(.*)$ /bar.php?code=$1 [NC,L] 

, и я думаю, что разберутся.

+0

Это зависит от того, где вы ставите правило. Если он находится в .htaccess, вы правы, но если он находится в главном файле apache conf, это не так. – mkb

+0

Хорошая точка, с поправками. – cletus

+0

Спасибо за ввод cletus, я изменил второе правило на RewriteRule^/? (. *) $ /bar.php?code=$1 [NC, L], но я все еще получаю основной запрос (http: // example .com) перенаправлено на http://example.com/bar.php – borkencode

0

Используйте директиву RewriteCond перед вторым правилом, так что он соответствует только URL-адреса, которые вы хотите, например:

RewriteCond %{REQUEST_URI} ^/blerg$ 
RewriteRule ... 
0

добавить правило, перехватывает http://example.com/ запрос и предотвращает последнее правило запуск:

RewriteRule ^/(.*\.(php|html|htm|css|jpg))$ /$1 [NC,L] 
RewriteRule ^/$ /index.php [L] 
RewriteRule ^/(.*)$ /bar.php?code=$1 [NC,L] 

Я обычно добавляю QSA («строка запроса добавить») в мои правила: [QSA, L].

Этот набор правил заставляет запросы на несуществующие файлы пройти через скрипт обработчика:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ /handler.php?request=$1 [QSA,L] 
+0

Это очень близко! Запрос без имени файла (example.com/) перенаправляется на bar.php? Code =/index.html, а другие вызовы также имеют косую черту перед ними. – borkencode

3

Не совсем то, что вы просили я понимаю, но я часто использую это.Htaccess:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

..разработать послать что-нибудь, что не является фактическим файл или каталог в index.php, который затем содержит логику, чтобы интерпретировать то, что находится в строке URL.

например.

$url_array = split('/', $_SERVER['REQUEST_URI']); 
array_shift($url_array); // remove first value as it's empty 
Смежные вопросы