На моя сървър има настройка на заместващ DNS, нещо като .example.com. В моята основна папка има някои сайтове, така че това, от което се нуждая, е да имам нещо подобно: test.example.com трябва да използва test директория (имам близо 50 сайта, не само един).

Искам да го направя с .htaccess файл. В момента имам следните правила в моя .htaccess файл:

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] RewriteCond %{DOCUMENT_ROOT}/%1 !-d RewriteRule ^ - [L,R=404] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] RewriteCond %{DOCUMENT_ROOT}/%1 -d RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -d RewriteRule ^(.*)$ /%1/$1 [R=301,L] 

Прави нещо, т.е.когато ударя test.example.com тя посещава тестовата директория и извлича данни, но записва URL адреса като test.example.com/test// (2 наклонени черти в края).

Също така, когато щракна върху която и да е връзка (напр. /login) отвежда ме до test.example.com/login но не работи докато test.example.com/test//login страница за зареждане, но тя не изпраща данни от формуляра, които са изпратени за вход (загубени поради пренасочване 301).

В директория / .htaccess контекст, кодът, който сте публикували по-горе, всъщност няма да направи нищо !? Така че, или виждате резултата от кеширан отговор, което е напълно възможно, тъй като имате работа с 301 (постоянни) пренасочвания, които са естествено кеширани от браузъра. Или имате друг код, който изпълнява това пренасочване?

Също така не мога да видя откъде ще идва двойната наклонена черта, дори ако се е случило „нещо“ - което допълнително ми подсказва, че виждате кеширан отговор, или нещо друго отива?

(Ако обаче тези директиви са директно в конфигурацията на сървъра, за разлика от .htaccess (както е посочено), тогава тези директиви вероятно ще направят нещо и наистина ще получите двойна наклонена черта!)

Конкретно ...

RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -d 

В директория / .htaccess контекст, тези условия ще никога бъдете успешни, така че следното RewriteRule директива, която изпълнява пренасочването, никога няма да възникне. Вероятно сте искали да използвате REQUEST_URI сървърна променлива вместо REQUEST_FILENAME. (Въпреки това, в контекста на сървъра, REQUEST_FILENAME е същото като REQUEST_URI към момента, в който заявката е първоначално обработена.)

REQUEST_FILENAME вече съдържа абсолютния път на файловата система, към който се преобразува URI, така че да добавя това към пътя на файловата система на DOCUMENT_ROOT и поддиректорията очевидно няма да работи.

Бих се усъмнил дали наистина така или иначе бихте искали да направите това. (т.е. проверка за съществуването на искания файл / директория в съответната поддиректория преди пренасочване.) Това според мен изглежда ненужно и ограничава типа на "сайтовете", които можете да хоствате. Мисля, че би било за предпочитане да пренапишете безусловно всички заявки за поддомейна в съответната поддиректория (ако съществува) и да позволите на всеки „сайт“ да обработва 404 - което ви позволява да имате персонализирани 404 за всеки сайт, ако желаете.

Също така, мисля, че това трябва да бъде вътрешно пренаписване (към поддиректорията), а не външно пренасочване. т.е. Искане за test.example.com/login трябва да остане в test.example.com/login (доколкото това, което вижда потребителят) и не външно пренасочени да се test.example.com/test/login? В противен случай какъв е смисълът на поддомейна? Това също би разрешило проблема с данните на формуляра, които не се предават през пренасочването (защото 301 превръща заявката POST в GET).

Затова опитайте вместо това нещо като следното:

RewriteEngine On # Don't process requests for the www subdomain or apex domain RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC] RewriteRule ^ - [L] # Rewrite all direct requests for subdomains that exist as subdirectories RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com [NC] RewriteCond %{DOCUMENT_ROOT}/%1 -d RewriteRule (.*) /%1/$1 [L] 

Предишните ви правила включваха условие (повторено за всяко правило), което изключваше заявките за www поддомейн. Разделих това като свое правило.

Преди това имахте предварителна проверка, която тестваше, че поддомейнът съществува като поддиректория. Това е ненужно, ако проверите съществуването на тази поддиректория във втория блок с правила.

The RewriteCond директива, която проверява срещу REDIRECT_STATUS Променливата на средата гарантира, че всички директни заявки (от клиента) се пренасочват, а не вътрешни пренаписвания - което избягва цикъл на пренаписване. Имайте предвид, че това се пренаписва всичко заявки (освен ако няма друга .htaccess файл в поддиректорията, който използва mod_rewrite), независимо дали поддиректорията вече има префикс на URL адреса - това позволява влагането на поддиректории със същото име, на всякаква дълбочина, напр. /test/test/test/. Въпреки това би било за предпочитане поддиректорията на сайта да е уникална в този сайт.

Липсата на R флаг на RewriteRule прави това вътрешно пренаписване вместо външно пренасочване (така че URL адресът не се актуализира в адресната лента).

И се уверете, че кешът на браузъра е чист!

е работил за вас: Charles Robertson | Искате ли да се свържете с нас?