Пренасочване на всички заявки към подпапка с htaccess

anonimen

Super Moderator
Здравейте!
От половин час се чеша по главата защо това не пренасочва всичко към поддиректорията site:
(a дава error 500)
Код:
RewriteEngine on
RewriteRule ^(.*)$ site/$1
Това се намира в главната директория, в която имам папка site. (С един празен index.php в нея)
Забелязах, че ако сложа index.php на мястото на $1, работи, а и index.php?$1 също работи. Но как да бъде по горния начин?

Едит - видях, че ако заобиколя регулярния израз с наклонени черти не дава грешка, но пък тогава не работи пренасочването.
 
Здравей,
имаш ли инсталиран Rewrite мод за apache и php ?,ако нямаш няма как да го подкараш по този начин който ти искаш.Този .htaccess само това ли има в него?
 
policezone каза:
Здравей,
имаш ли инсталиран Rewrite мод за apache и php ?,ако нямаш няма как да го подкараш по този начин който ти искаш.Този .htaccess само това ли има в него?
Ами не знам(използвам xampp, не съм променял май никакви настройки), предполагам че да. Защото ако напиша нещо най-елементарно като долното, работи.
Код:
RewriteEngine On
RewriteRule ^index$ index.php
Т.е. като въведа localhost/index се отваря файлът index.php

Защо искам да направя това?
Защото по подразбиране папката htdocs в xampp пакета е пълна с файлове и папки. А искам страниците, които създавам, да са си в собствена директория и да не се влияят (евентуално) от други.
Бих изтрил въпросните първоначални файлове и папки, но се притеснявам да се замажа всичко и да трябва да преинсталирам. (и без резултат)


Този .htaccess само това ли има в него?
Да, в този htaccess има само това.
 
Разбирам какво искаш да направиш,но провери дали имаш този мод в apache.
<IfModule mod_rewrite.c>
Ако не си правил сайт до сега и си инсталирал xampp можеш спокойно да изтриеш всичко в директорията която е по-подразбиране.
Пробвай така и после кажи какво е положението.
Поздрави !
 
Пробвай нещо такова
PHP:
RewriteRule ^site/.+$ - [L]

RewriteCond %{DOCUMENT_ROOT}/site/$0 -f
RewriteRule ^.+$ /site/$0 [L]
 
policezone, не разбрах какво трябва да направя. Онзи ред какво трябва да прави?

Replace, кодът ти работи перфектно, с малки добавки -
Код:
RewriteEngine On
RewriteRule ^site/.+$ - [L]
RewriteCond %{DOCUMENT_ROOT}/site/$0 -f
RewriteRule ^.+$ /site/$0 [L]
DirectoryIndex /site/index.php
Само едно питане имам - нали третия ред (този с RewriteCond) трябва да връща 403 ако въведa http://localhost/site/alabala.php ?
Но не прави това. Всъщност, нищо не прави. (или поне аз така си мисля)
 
Това е условие, когато (ако) бъде изпълнено със следващия ред посочваш накъде трябва да води.
 
В папката htdocs имам следните неща:

htdocs:
Код:
... - папките на xampp
index.html
site/
----- index.php
----- page.php
----- file.php
druga_papka/
----- index.php
Ето тестовете, които направих, със съответните резултати:

1. http://localhost/ :: дава индекса на папката site - Оk
2. http://localhost/site/ :: дава индекса на папката site - очаквам да даде /xampp/htdocs/site/site/index.php
3. http://localhost/page.php :: дава page.php от папката sie - Ok
4. http://localhost/site/page.php :: дава page.php от папката site - очаквам да даде xampp/htdocs/site/site/page.php
5. http://localhost/druga_papka/ :: дава index.php от папката site - очаквах да даде localhost/site/druga_papka
6. http://localhost/druga_papka/index.php :: дава index.php от папката druga_papka от htdocs - очаквах като т. 5

Не мога да разбера тестове 2, 4, 5 и 6. Аз очаквах, че ще дава всичко от папката site, независимо дали има друга папка извън нея. :shock: Защо?
 
Сложи и тези редове в htaccess-a
PHP:
+RewriteCond %{REQUEST_FILENAME} !-f 
+RewriteCond %{REQUEST_FILENAME} !-d
 
Мисля, че трябва да направя така?
Код:
DirectoryIndex /site/index.php
RewriteEngine On
RewriteRule ^site/.+$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/site/$0 -f
RewriteRule ^.+$ /site/$0 [L]
За жалост продължава при http://localhost/site/ да изкарва индекса на site.
A има ли обяснение защо моят първоначален опит не сработи?
anonimen каза:
RewriteEngine on
RewriteRule /^(.*)$/ /site/$1
Направих дори това:
PHP:
echo preg_replace("/^(.*)$/", "/site$1", "/index.php");
И се убедих, че трябва да работи нормално...
 
Изтривай всичко в htdocs, тези файлове от xampp няма да ти потрябват никога, те са информативни.
 
anonimen каза:
В папката htdocs имам следните неща:

htdocs:
Код:
... - папките на xampp
index.html
site/
----- index.php
----- page.php
----- file.php
druga_papka/
----- index.php
Ето тестовете, които направих, със съответните резултати:

1. http://localhost/ :: дава индекса на папката site
2. http://localhost/site/ :: дава индекса на папката site
3. http://localhost/page.php :: дава page.php от папката site
4. http://localhost/site/page.php :: дава page.php от папката site
5. http://localhost/druga_papka/ :: дава index.php от папката site
6. http://localhost/druga_papka/index.php :: дава index.php от папката druga_papka

Не мога да разбера тестове 2, 4, 5 и 6. Аз очаквах, че ще дава всичко от папката site, независимо дали има друга папка извън нея. :shock: Защо?
Получава се точно така, заради този ред
PHP:
DirectoryIndex /site/index.php
Аз вече малко се обърках какво очакваш от кода, затова след като махнеш и този ред, допиши срещу всяка точка какво очакваш да ти покаже :idea:
 
eddyy93 каза:
Изтривай всичко в htdocs, тези файлове от xampp няма да ти потрябват никога, те са информативни.
Ок.
Но все пак ще се радвам ако успея да направя това, към което бях тръгнал - а именно с htaccess да "телепортирам" всичко в дадена поддиректиря.

Онзи ред с directoryindex го сложих за да не дава 404 когато въведа само localhost, без никакви допълнителни неща.
За да не натрупвам излишно текст, ще си редактирам горното мнение: http://web-tourist.net/forum/viewtopic.php?p=653869#653869
(с това, което очаквам)

Или с две думи: при заявка от вида
localhost/kakvoto_i_da_e
да потърси
localhost/site/kakvoto_i_da_e
 
Ето това ще ти свърши работа:

localhost може да го замениш с домейна ти.
testdir ще е новата директория от която ще чете.

PHP:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^localhost$ [NC,OR]
RewriteCond %{HTTP_HOST} ^localhost$
RewriteCond %{REQUEST_URI} !testdir/
RewriteRule (.*) /testdir/$1 [L]
</IfModule>

Ето и от къде го "свих":
http://stackoverflow.com/questions/8118941/using-htaccess-to-change-document-root

EDIT:
Една промяна само направи на този ред:
Код:
RewriteRule (.*) /testdir/$1 [L]

Замени го с това:
Код:
RewriteRule (.*) /testdir/$1 [QSA,L]

Защото може иначе да имаш проблеми с $_GET.
 
Колкото и да е странно, отново при http://localhost/site/ и http://localhost/ резултатът е същия - дава индекса на site. (дори ако създам още една папка site с друг index.php в нея)
 
Нещо не го правиш както трябва, този код работи.

Ако работиш на локалхоста:

Правиш една директория в htdocs: /testdir
В дир. правиш файл: index.php
В файла htdocs/testdir/index.php пишеш: FILE IS LOCATED IN testdir/

В папката htdocs правиш един файл: .htaccess
Преди точката не трябва да има нищо, трябва да е ".htaccess"

В този файл слагаш единствено този код:
Код:
<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_HOST} ^localhost$ [NC,OR]

RewriteCond %{HTTP_HOST} ^localhost$

RewriteCond %{REQUEST_URI} !testdir/

RewriteRule (.*) /testdir/$1 [L]

</IfModule>

После в браузера пишеш единствено: http://localhost/
След като натиснеш enter, ще ти се отвори index.php от testdir/ тоест все едно си въвъел http://localhost/testdir/index.php
 
Ако заменяш testdir, с твоя site, е нормално да не става.
site/site
или
testdir/testdir
няма да бъдат изпълними от htaccess файла (поне от горните кодове, а и аз не мога да се сетя как да го заобиколим това).
Това разбира се е предложение, в твоя случай може наистина нещо да не работи поради една, или друга причина. Все пак пробвай главната ти папка /site/ да я смениш с някоя уникално (примерно asdffawmlfwa) и с нея да промениш горните правила в htaccess-а. :idea:
 

Back
Горе