Как мне записать SCRIPT_URI в заголовок в Apache?

У меня есть установка, в которой у меня есть такие серверы:

балансировщик нагрузки -> Apache -> Tomcat

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

Я пробовал использовать mod_rewrite и mod_headers, так что сделайте это, но безуспешно. если я посмотрю на http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html, тогда кажется очевидным, что мне нужна переменная SCRIPT_URI:

SCRIPT_URI=http://en1.engelschall.com/u/rse/

Я также просмотрел этот http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html, так что выясните, как писать заголовки, и добились некоторых успехов, но недостаточно.

У меня установлен php на сервере apache, и если я посмотрю на phpinfo (), я вижу, что SCRIPT_URI есть и имеет разумное значение.

Я просто не могу заставить его записать это в заголовок. Вот упрощенная версия того, что я сделал:

#load modules
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
#Get the original uri used
RewriteRule .* - [E=INFO_SCRIPT_URI:%{SCRIPT_URI},NE]
RequestHeader set x-orig-uri "%{INFO_SCRIPT_URI}e"

Я пробовал несколько других вариантов, и как в Windows, так и в cygwin и ubuntu linux

Любые идеи?


person s3v1    schedule 21.03.2011    source источник


Ответы (2)


Я сам нашел обходной путь, хотя это не то простое и понятное решение, которое я хотел. Мне удалось получить отдельные части и использовать их для создания полного URI:

<IfModule !rewrite_module>
    LoadModule rewrite_module modules/mod_rewrite.so
</IfModule>

<IfModule !headers_module>
    LoadModule headers_module modules/mod_headers.so
</IfModule>


<IfModule rewrite_module>
<IfModule headers_module>

####### INITIAL SETUP #########################
    RewriteEngine on

####### SET HEADERS #########################
    #get and set the host name
        RewriteRule .* - [E=INFO_HTTP_HOST:%{HTTP_HOST},NE]
        RequestHeader set x-orig-host "%{INFO_HTTP_HOST}e"


    #get and set the host port
        RewriteRule .* - [E=INFO_SERVER_PORT:%{SERVER_PORT},NE]
        RequestHeader set x-orig-port "%{INFO_SERVER_PORT}e"


    #If the uri starts with a slash and some alphanumerics, then make a 
    #group of that until the first non-alpha (ie. the next slash)
        RewriteCond %{REQUEST_URI} ^(/[\w-]+)
    #Save the content of the regex match group ( %1 ) in an environment variable
        RewriteRule .* - [E=INFO_REQUEST_CONTEXT:%1,NE]
    #Set a header with the content of the environment variable
        RequestHeader set x-orig-context "%{INFO_REQUEST_CONTEXT}e"


    #If the accept-header contains a number after ;version= then make a regex group of that number
        RewriteCond %{HTTP_ACCEPT} \+json;version=(\d+)$ 
    #Save the content of the regex match group ( %1 ) in an environment variable
        RewriteRule .* - [E=INFO_ACCEPT_VERSION:%1,NE]
    #Set a header with the content of the environment variable
        RequestHeader set x-orig-accept-version "%{INFO_ACCEPT_VERSION}e"


    #If the accept-header contains kasia2. followed by some letters, 
    #then make a regex group of those letters
        RewriteCond %{HTTP_ACCEPT} kasia2.(\w+).*
    #Save the content of the regex match group ( %1 ) in an environment variable
        RewriteRule .* - [E=INFO_ACCEPT_NAME:%1,NE]
    #Set a header with the content of the environment variable
        RequestHeader set x-orig-accept-name "%{INFO_ACCEPT_NAME}e"


    #If https is on ...
        RewriteCond %{HTTPS} on
    #...then set the protocol environment variable to "https"
        RewriteRule .* - [E=INFO_PROTOCOL:https,NE]
    #If https is off ...
        RewriteCond %{HTTPS} off
    #...then we assume it must be "http"
        RewriteRule .* - [E=INFO_PROTOCOL:http,NE]
    #Finally, set the protocol header
        RequestHeader set x-orig-protocol "%{INFO_PROTOCOL}e"


    #Get the request uri and set an environment variable
        RewriteRule .* - [E=INFO_REQUEST_URI:%{REQUEST_URI},NE]
    #Build the whole original url out of the available parts. SCRIPT_URI is always null, otherwise we could have used that.
        RequestHeader set x-orig-url "%{INFO_PROTOCOL}e://%{INFO_HTTP_HOST}e%{INFO_REQUEST_URI}e"
    #In addition make an url with only the host and context, for convenience
        RequestHeader set x-orig-url-base "%{INFO_PROTOCOL}e://%{INFO_HTTP_HOST}e%{INFO_REQUEST_CONTEXT}e"

</IfModule>
</IfModule>
person s3v1    schedule 25.03.2011

Согласно https://serverfault.com/questions/23470/setting-apache-environment-variable-on-mod-rewrite-rewrite-condition, вам необходимо настроить порядок выполнения с помощью различные разделы конфигурации

Здесь я добавил фиктивный <Location> раздел

RewriteRule ^ - [E=FOO:set_by_rewrite_rule]
RequestHeader set x-foo-outside-location %{FOO}e

<Location  "/bla">
    RequestHeader set x-foo-in-location %{FOO}e
</Location>

и это заголовки, которые я получаю

x-foo-in-location='set_by_rewrite_rule'
x-foo-outside-location='(null)'

Обратите внимание, что я получаю оба заголовка равными null, если использую <Location "/"> (и что я не могу найти решение, действительное для всех путей запроса)

Также обратите внимание, что ответ Себастьяна получает переменные env в заголовке без какого-либо фиктивного раздела конфигурации ... Вперед!

person xverges    schedule 15.02.2012