Запустить PHP-код из .htaccess? - PullRequest
7 голосов
/ 24 июня 2009

Скажем, у меня есть перезапись, которая должна передать URL в функцию PHP и получить значение, чтобы определить, каким должно быть новое место назначения? Есть ли способ сделать это?

Спасибо.

UPDATE:

Спасибо, ребята. У меня все еще проблемы, но я покажу вам свой код:

.htaccess

#I got the file path by echoing DOCUMENT_ROOT and added the rest.
RewriteMap fixurl prg:/var/www/vhosts/mydomain.com/httpsdocs/domain_prototype/code_base/url_handler.php

RewriteEngine On
RewriteRule (.*) ${fixurl:$1} [PT]

PHP:

set_time_limit(0); # forever program!
$keyboard = fopen("php://stdin","r");
while (1) {
        $line = trim(fgets($keyboard));
        print "www.google.com\n";  # <-- just test to see if working.
}

Однако я получаю 500 Внутренняя ошибка сервера Я не уверен, есть ли ошибка в моем .htaccess или в моем PHP?

Ответы [ 4 ]

11 голосов
/ 24 июня 2009

Существует нечто, называемое RewriteMap.

Вы можете вызвать исполняемый скрипт, который вернет URL для перезаписи.

Проверьте эту статью для получения дополнительной информации и примеров (на Perl, но полностью применимы к любому другому языку):

http://www.onlamp.com/pub/a/apache/2005/04/28/apacheckbk.html

Сводка предостережений:

  • Необходимо запустить цикл чтения STDIN (т. Е. Не завершать работу после получения URL-адреса)
  • Необходимо напечатать URL-адрес, чтобы переписать его на ЗАКРЫТЫЙ символ новой строки
  • Должен быть читаемым и исполняемым пользователем. Apache запускается как

Это способ создания карты

RewriteMap fixurl prg:/usr/local/scripts/fixit.php

И теперь мы можем использовать его в RewriteRule:

RewriteEngine On
RewriteRule (.*) ${fixurl:$1} 

РЕДАКТИРОВАТЬ: Об внутренней ошибке сервера. Наиболее вероятная причина - то, что упоминает Гамбо, RewriteMap нельзя использовать в .htaccess, к сожалению. Вы можете использовать его в RewriteRule в .htaccess, но можете создавать его только в конфигурации сервера или конфигурации виртуального хоста. Чтобы быть уверенным, проверьте журнал ошибок.

Таким образом, единственным решением для PHP / .htaccess было бы переписать все в определенную программу PHP, которая выполняет проверку и перенаправляет, используя заголовок Location. Что-то вроде:

RewriteRule (.*) proxy.php?args=$1 [QSA]

Затем в proxy.php

<?php
      $url = get_proper_destination($QUERY_STRING); #args will have the URI path, 
                                                    #and, via QSA you will have
                                                    #the original query string
      header("Location: $url");
?>
3 голосов
/ 24 июня 2009

Да; вам нужен RewriteMap из разнообразия Программы внешней перезаписи.

2 голосов
/ 24 июня 2009

Обратите внимание, что директива RewriteMap может использоваться только в конфигурации сервера или виртуальный хост context .

2 голосов
/ 24 июня 2009

Что бы я сделал, это передал бы URL на страницу PHP и затем сделал бы окончательное перенаправление с помощью опции заголовков PHP.

header("Location: new-page.php");

Если вы не хотите, чтобы он перенаправлялся, вы также можете добавить нужную страницу. Я считаю, что это немного более гибко, чем использование RewriteMap.

Надеюсь, это поможет!

...