Sunt câteva probleme aici...
Într-un per-director .htaccess
context, calea URL potrivită de RewriteRule
model nu începe niciodată cu o bară oblică, deci regex ^/(.*):(.*)
nu se va potrivi niciodată și directiva nu face nimic. Asa ca RewriteRule
model ar trebui să fie ^(.*):(.*)
- fără prefix bară oblică.
- Cu toate acestea, această regex este foarte general și cel mai probabil se potrivește prea mult. Dacă vă așteptați la o solicitare a formularului
/1:1
, adică. /<număr>:<număr>
apoi utilizați un regex mai specific, de ex. ^\d+:\d+$
Deoarece primiți un 403 Forbidden (spre deosebire de un 404 Not Found), presupun că vă aflați pe un server Windows. „Problema” aici este aceea :
(punctele) nu sunt caractere valide în numele fișierelor Windows. Aceasta este o problemă cu .htaccess
deoarece cererea este mapată la sistemul de fișiere înainte .htaccess
(și mod_rewrite) este procesat - moment în care 403 este declanșat. În schimb, ar trebui să rescrieți cererea în configurația serverului principal (sau containerul VirtualHost) - ceea ce apare inainte de cererea este mapată la sistemul de fișiere.
Deci, ceea ce încercați să faceți... rescrieți cererea care conține două puncte, folosind .htaccess
pe un server Windows nu este posibil. Puteți face acest lucru pe Linux (care permite două puncte în numele fișierelor) SAU în configurația serverului principal (Server sau virtualhost context) pe Windows, dar nu în .htaccess
.
Când utilizați mod_rewrite într-un Server (sau virtualhost) context (spre deosebire de .htaccess
) tu do nevoie de prefixul slash (pe ambele model și substituţie siruri de caractere). De exemplu:
# Într-un context „server” (sau „gazdă virtuală”),
# nu „.htaccess” (sau secțiunea „<Directory>” din configurația serverului)
RewriteEngine Pornit
# Rescrie intern „/1:1” în calea-info pe „index.php”
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
The $0
backreference conține întreaga cale URL care este capturată de RewriteRule
model. Aceasta include prefixul slash (atunci când este utilizat într-un Server context), motiv pentru care delimitatorul slash este omis în substituţie şir.
ACTUALIZAȚI:
Am făcut modificările, vă rog să vă uitați din nou la întrebarea mea și să vedeți, am introdus-o corect
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
Se pare că nu ai făcut nicio modificare; cel putin nu in sectiunea potrivita? După cum sa menționat mai sus, aceste directive trebuie adăugate direct la <VirtualHost>
container (pe care l-ați postat). Ele nu pot fi adăugate la .htaccess
fișier pe un sistem de operare Windows - pur și simplu nu vor face nimic și veți primi răspunsul 403 Forbidden așa cum este menționat.
Cele de mai sus ar trebui scrise astfel:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
# Enable the rewrite engine in a virtualhost context
RewriteEngine On
# Internally rewrite "/1:1" to path-info on "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
<Directory "${INSTALL_DIR}/www/">
Options -Indexes -Includes +FollowSymLinks -MultiViews
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
Va trebui să reporniți Apache pentru ca aceste modificări să aibă efect. (Spre deosebire de .htaccess
fișiere care sunt interpretate în timpul execuției.)
Totuși, în ce alte directive aveți .htaccess
și cum sunt direcționate celelalte adrese URL ale dvs.? Ați postat următoarea directivă în comentarii:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Aceasta direcționează adresa URL destul de diferit față de ceea ce solicitați în întrebarea dvs. În întrebarea dvs., transmiteți calea URL ca informații suplimentare despre cale index.php
. Cu toate acestea, în această directivă treceți adresa URL ca parte a șirului de interogare? Cum se leagă acestea? De ce sunt diferite? În mod evident, trebuie să transmiteți adresa URL în modul în care se așteaptă „aplicația MVC”.