Cum se elimină prefixul de versiune din URI de solicitare și se utilizează root core document?

Trebuie să acceptăm câteva versiuni majore și minore ale serviciului web, deci decizi să folosim versiunea în URL ca aceasta:

http://service/      # last deployed version of service
http://service/1/    # symlink that points to the last deployed major version 1.x
http://service/1.2/  # symlink that points to the last deployed minor version 1.2.x

Stocăm toate etichetele în foldere și facem simboluri la versiunile corecte:

Here the root directory for apache:
lrwxr-xr-x   1 xxxx xxxx 28 May 23 15:21 1 -> /home/site/tags/20120523084844-HEAD
lrwxr-xr-x   1 xxxx xxxx 28 Apr 27 15:21 1.1 -> /home/site/tags/20120427152123-HEAD
lrwxr-xr-x   1 xxxx xxxx 28 May 23 08:48 1.2 -> /home/site/tags/20120523084844-HEAD
lrwxr-xr-x   1 xxxx xxxx 28 May 24 16:12 2 -> /home/site/tags/20120524161232-HEAD
(source code here for last deployed version)
.....

Există o problemă aici, deoarece vom avea prefix de versiune în REQUEST_URI în PHP și Symfony router-ul nu se va potrivi cu modelele. Cum putem tăia acel prefix de versiune, dar folosim încă un director specific ca root?

De exemplu, atunci când facem o cerere către http: //service/1.2/some/handler/pattern atunci codul din directorul 1.2 va fi folosit și REQUEST_URI în PHP va fi/some/handler/model

3
Nu doresc să adaug un model de versiune la codul sursă, deoarece fiecare instalare de serviciu nu ar trebui să fie conștientă de versiunea în URI.
adăugat autor lisachenko, sursa
Modelul de rutare/serviciul /: versiunea/unii/manipulatorul/modelul (simfonia 1) sau/service/{version}/some/handler/pattern (simfony 2) nu funcționează?
adăugat autor Pierre, sursa

2 răspunsuri

Incearca asta:

RewriteEngine On
RewriteBase /

RewriteCond $1 !^[0-9.]+/
RewriteRule ^(.*) /1.2/$1 [L]

Singurul gând este că puteți testa versiunea doar la un moment dat și trebuie să schimbați htaccess dacă doriți altul.

Pot sugera folosirea subdomeniilor pentru versiuni?

1
adăugat
Vă mulțumim pentru un răspuns! Din păcate, trebuie să acceptăm mai multe versiuni la un moment dat. M-am gândit deja la subdomenii virtuale și la proxy-uri transparente inverse cu apache. Dar acest lucru va fi prea complicat pentru a fi utilizat în mediul de producție.
adăugat autor lisachenko, sursa

Aceasta este o problemă interesantă.

Nu cred că se poate face doar cu htaccess, cel puțin fără hack-uri urâte. REQUEST_URI păstrează întotdeauna cererea inițială și, din câte știu, nu există nicio modalitate de a modifica (dacă încercăm să atribuiți conținutului variabilei REQUEST_URI prin E = REQUEST_URI = "ceva", atunci va fi creată o variabilă de mediu numită "REDIRECT_REQUEST_URI" ).

Nu sunt familiarizat cu Symfony, așa că nu știu cât de ușor este să editați scriptul care gestionează rutarea. Dacă e ușor, ai putea să faci ceva de genul

RewriteRule ^[1-9.]/(.*)$ - [R,QSA,NC,E=HANDLER:$1]

apoi în PHP ați putea copia manualul la request_uri:

$_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_HANDLER'];

În afară de schimbarea PHP ca aceasta, mă pot gândi doar la acest lucru: prima redirecționare greu la handler, punând informațiile despre versiune în șirul de interogare. Apoi, capturați această solicitare și redirecționați soft la versiunea/manipulatorul. Request_uri va fi setat corect, dar este urât și foarte greșit.

Acestea fiind spuse, sunt total de acord cu Gerben despre utilizarea subdomeniilor pentru versiuni.

1
adăugat
Da, se pare că nu există o soluție elegantă. Numai subdomenii cu proxy. Este păcat, dar voi pune un hack la nivel de cod (
adăugat autor lisachenko, sursa
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT