Apache мод переписать простой редирект - PullRequest
2 голосов
/ 08 мая 2009

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

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

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

Ответы [ 5 ]

3 голосов
/ 08 мая 2009

Не совсем то, что вы просили, я понимаю, но я часто использую это в .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
1 голос
/ 08 мая 2009

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

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 голосов
/ 08 мая 2009

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

RewriteCond %{REQUEST_URI} ^/blerg$
RewriteRule ...
0 голосов
/ 08 мая 2009

Добавить правило, которое перехватывает запрос 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 голосов
/ 08 мая 2009

Предполагая, что это в .htaccess, а не в файле apache conf, 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]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...