2013-07-07 3 views
2

В моем каталоге «public_html» У меня есть следующая структура:Root изменить папку (.htaccess)

- root 
    - index.html 
    - blog 
    - index.html 
- lab 
    - index.html 
- wp 
    - (WORDPRESS FILES) 

«лаборатория» и «РГ» каталоги просто поддоменов каталоги («http://lab.tomblanchard.co.uk„и“http://wp.tomblanchard.co.uk»), которые работают нормально.

В основном я хочу, чтобы главный домен («http://tomblanchard.co.uk„), чтобы указать на „корень“ без какой-либо фактической переадресации, например, я хочу“http://tomblanchard.co.uk», чтобы указать на „index.html“ файл в «корне ", я хочу« http://tomblanchard.co.uk/blog »указать на файл« index.html »в каталоге« root/blog »и так далее.

я отчасти достигается с помощью следующего кода в моем файле «.htaccess»:

# Add directives 
RewriteEngine on 

# Remove ".html" extension from URLs 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html 

# Change root directory to "root" folder 
Options +FollowSymLinks 
RewriteCond %{REQUEST_URI} !(.*)root 
RewriteRule ^(.*)$ root/$1 [L] 

Единственная проблема заключается в том, что такие вещи, как „http://tomblanchard.co.uk/root/“ и „http://tomblanchard.co.uk/root/blog/“ до сих пор работают, когда на самом деле они не должен» t может быть доступен (404).

Если у кого-нибудь есть идея, как сортировать это или имеет более сильный способ сделать это, будем признательны.

Update

Наконец получил это работает, как я хотел после нескольких часов исследования, я использовал следующее:

# Add directives 
RewriteEngine on 

# Change root directory to "root" folder 
RewriteCond %{THE_REQUEST} ^GET\ /root/ 
RewriteRule ^root/(.*) /$1 [L,R=301] 
RewriteRule !^root/ root%{REQUEST_URI} [L] 
+0

Возможно, вместо этого используйте VHosts. – DaGardner

+0

Посмотрите на использование файла http.conf в вашей установке apache. Вы можете настроить vhosts для указания на любой каталог для любого домена –

ответ

0

Вы не определяет никакого правила, чтобы блокировать /root адрес так, как вы хотите заблокировать его, когда вам нечего делать?

Попробуйте это:

# Add directives 
RewriteEngine on 

RewriteCond %{REQUEST_URI} .root [NC] 
RewriteRule (.*)/[L,R=404] 

# Remove ".html" extension from URLs 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html 

# Change root directory to "root" folder 
RewriteCond %{HTTP_HOST} ^tomblanchard.co.uk$ [NC,OR] 
RewriteCond %{HTTP_HOST} ^www.tomblanchard.co.uk$ 
RewriteCond %{REQUEST_URI} !.root 
RewriteRule (.*) /root/$1 [L,R=301,QSA] 

Это не проверяется, так что если он не будет работать, играть с ним, чтобы получить вашу потребность.

+0

Я ценю ответ, но это только дает мне 404 на каждой странице домена. – Tom

+0

Как я уже говорил, это не проверено, но я объясню, почему он так себя ведет. Во-первых, когда вы достигаете перенаправления 'http: // tomblanchard.co.uk /' и 'http: // tomblanchard.co.uk/blog' в корневой каталог, тогда предполагается, что вы находитесь в каталоге' root' и когда он достигает правила, которое блокирует прямой доступ root, он ничего не показывает. Потому что он знает, что ты там. – MahanGM

+0

Переписывание в файл с именем '404.html' - это неправильный способ вызвать 404 - он все равно вернет статус 200, как если бы URL был действительным. Вместо этого используйте соответствующий флаг перезаписи, например ['R = 404'] (http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_r), [' F'] (http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_f) или ['G'] (http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_g). – IMSoP

1

Порядок директив в mod_rewrite важен, так как каждое правило видит результат предыдущего правила в качестве входного для теста. Вам нужно сделать 3 (или, возможно, 4) вещи, в следующем порядке:

  1. Запретить доступ к любому URL, начиная /root/ (мы должны сделать это первым, иначе все будет отказано!)
  2. Это вообще хорошая практика, чтобы каждый URL имел только одну действительную форму, поэтому URL-адреса, которые do указывают .html, должны вызвать переадресацию браузера на форму не .html. Это должно произойти до других переписывающих, иначе вы не можете отличить HTML-браузер от браузера и тот, который вы добавили практически.
  3. Посмотрите любой URL, не Отказано выше в каталоге /root/, а не настроенная DocumentRoot
  4. Посмотрите любой URL, не указывая на каталог под URL + .html, если этот файл существует. Это должно произойти после после других переписывающих, или проверка «файл существует» всегда будет терпеть неудачу.
# General directives 
Options +FollowSymLinks 
RewriteEngine on 

# Deny URLs beginning /root/, faking them as a 404 Not Found 
RewriteRule ^root/ [R=404] 

# Additional rule to strip .html off URLs in the browser 
RewriteRule ^(.*)\.html$ $1 [R=permanent,L] 

# Rewrite everything remaining to the /root sub-directory 
# (Host condition was in your post originally, then edited out; this is where it would go) 
RewriteCond %{HTTP_HOST} ^(www\.)?tomblanchard\.co\.uk$ 
RewriteRule ^(.*)$ root/$1 

# Handle "missing" ".html" extension from URLs 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html 

PS: Обратите внимание, мой тщательный язык для описания (внутренний) переписывает, в отличие от (браузера) перенаправляет: правила у вас есть не удаления.html от чего-либо, это добавления он, таким образом позволяя доступ к странице , если кто-то другой ее удаляет. Поскольку вы часто изменяете как в рамках ряда правил, важно четко различать URL-адрес, запрошенный браузером, и виртуальный URL-адрес Apache в конечном итоге будет служить.

+0

Разве не лучше поставить 'RewriteBase /' там? И я заметил, что что-то вроде '^ root /' не распознается на моем сервере, поэтому я написал что-то вроде '.root' для одного из моих проектов. Я просто хотел сказать это, потому что однажды это вызвало у меня головные боли. – MahanGM

+0

@MahanGM В зависимости от точного контекста сопоставляемая строка URL либо имеет, либо не содержит первую ведущую '/'; Я привык иметь доступ к фактическому определению VirtualHost, а не к файлу '.htaccess'; вы, вероятно, правы, что «RewriteBase» может быть необходимым/полезным. Что касается '.root', это будет соответствовать строке« root »где угодно **, кроме ** начала URL-адреса (поскольку вы только требуете, чтобы перед ним был один символ); вы, вероятно, хотите '^ /? root' или просто'^root'. – IMSoP

+0

Эй, действительно оцените работу, которую вы положили в этот @IMSoP, я только что проверил ее, и, как вы можете видеть, каждая страница - это всего лишь 404, к сожалению, любая идея, почему? – Tom

Смежные вопросы