Назад | Перейти на главную страницу

Lighttpd разделение URI запроса и удаление параметра запроса

Я использую lighttpd 1.4.33, который обратно проксируется с сервера Apache, открытого для Интернета. При доступе к сценарию с локального адреса сервера lighttpd параметры GET передаются сценарию нормально, и я получаю ожидаемый результат. Однако, когда доступ к сценарию осуществляется через прокси (и он перезаписывается следующим правилом lighttpd), параметры запроса, похоже, полностью отбрасываются.

Правило перезаписи, которое, кажется, вызывает проблему:

$HTTP["host"] =~ "^site\.example\.com$" {
        # This affects the requests that aren't rewritten below, ie. static stuff
        server.document-root = "/var/www/example/public"   
        url.rewrite-once = ( "^((?!assets).)*$" => "index.php/$1" )
}

Предполагается, что все URL-адреса будут переданы через механизм маршрутизации в index.php, за исключением статических файлов в /assets каталог, который должен обслуживаться статически. Обратите внимание, что /assets является субдиректором /var/www/example/public, так что это работает правильно.

Журнал отладки Lighttpd для запроса с отброшенным параметром:

2014-07-23 11:36:46: (response.c.310) Request-URI  :  /foo/bar?someparam=data 
2014-07-23 11:36:46: (response.c.311) URI-scheme   :  http 
2014-07-23 11:36:46: (response.c.312) URI-authority:  site.example.com 
2014-07-23 11:36:46: (response.c.313) URI-path     :  /foo/bar 
2014-07-23 11:36:46: (response.c.314) URI-query    :  someparam=data 
2014-07-23 11:36:46: (response.c.309) -- splitting Request-URI 
2014-07-23 11:36:46: (response.c.310) Request-URI  :  index.php/a
2014-07-23 11:36:46: (response.c.311) URI-scheme   :  http 
2014-07-23 11:36:46: (response.c.312) URI-authority:  site.example.com 
2014-07-23 11:36:46: (response.c.313) URI-path     :  index.php/a 
2014-07-23 11:36:46: (response.c.314) URI-query    :

Обратите внимание на пустой URI-query поле в последней строке. Кажется, что шаг «разделение URI запроса» все ломает.

Есть идеи о том, что может быть причиной этого?

Оказывается, есть более простой способ сделать это на lighttpd> = 1.4.24. Вы можете использовать url.rewrite-if-not-file директива, например так (lighttpd <= 1.4.33):

$HTTP["host"] =~ "^site\.example\.com$" {
        # Rewrite all requests to non-physical files
        url.rewrite-if-not-file =
        (
            "^(.*)$" => "index.php/$1"
        )
}

В этом примере используется $HTTP["host"] директива, как использование $HTTP["url"] директива не поддерживалась до 1.4.34. В lighttpd> = 1.4.34, вы можете использовать его в условном блоке URL:

$HTTP["url"] =~ "^\/site/$" {
        # Rewrite all requests to non-physical files
        url.rewrite-if-not-file =
        (
            "^(.*)$" => "index.php/$1"
        )
}

Думаю, если вы в порядке и действительно вынуждены использовать lighttpd <= 1.4.24, вы всегда можете использовать mod_magnet и Lua.