Проблемы с mod_rewrite и mod_userdir

#php #apache #mod-rewrite #apache2

#php #apache #mod-перезапись #apache2

Вопрос:

Я пытаюсь запустить локальную копию веб-сайта, который кто-то другой собрал. Сайт развернут и функционирует, и я пытаюсь настроить версию для разработки в моем каталоге public_html.

Сайт использует mod_rewrite для перенаправления всего трафика через скрипт шлюза, который выполняет различные шаги инициализации. У меня странная проблема, когда ссылки, включающие .php расширение, работают, но те, которые не умирают, за следующим исключением:

Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0 Fatal error: Unknown: Failed opening required 'redirect:/~george/site/.fiona/core/gateway.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0

Вот копия файла .htaccess (отредактированная для моей локальной установки)

 RewriteEngine On
Options  FollowSymLinks

RewriteBase /~george/site/
RewriteCond %{REQUEST_URI} !.fiona/core/gateway.php
RewriteRule ^.fiona/([a-z] )/([a-zA-Z0-9_-] )(.php)?$ .fiona/core/gateway.php?group=$1amp;destination=$2.php [L,QSA]
RewriteCond %{REQUEST_URI} !.fiona/core/gateway.php
RewriteRule ^([a-z] )/([a-zA-Z0-9_-] )(.php)?$ .fiona/core/gateway.php?group=$1amp;destination=$2.php [L,QSA]
RewriteCond %{REQUEST_URI} !.fiona/core/gateway.php
RewriteRule ^([a-zA-Z0-9_-] )(.php)?$ .fiona/core/gateway.php?destination=$1.php [L,QSA]  

Вот что я вижу в своих журналах mod_rewrite

localhost/~george/site/login

 127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/login.php -> login.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] applying pattern '^.fiona/([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri 'login.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/login.php -> login.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri 'login.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/login.php -> login.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-zA-Z0-9_-] )(.php)?$' to uri 'login.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (4) [perdir /home/george/public_html/site/] RewriteCond: input='/~george/site/login.php' pattern='!.fiona/core/gateway.php' => matched
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (2) [perdir /home/george/public_html/site/] rewrite 'login.php' -> '.fiona/core/gateway.php?destination=login.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) split uri=.fiona/core/gateway.php?destination=login.php -> uri=.fiona/core/gateway.php, args=destination=login.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (3) [perdir /home/george/public_html/site/] add per-dir prefix: .fiona/core/gateway.php -> /home/george/public_html/site/.fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (2) [perdir /home/george/public_html/site/] trying to replace prefix /home/george/public_html/site/ with /~george/site/
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (5) strip matching prefix: /home/george/public_html/site/.fiona/core/gateway.php -> .fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (4) add subst prefix: .fiona/core/gateway.php -> /~george/site/.fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#211168d0/subreq] (1) [perdir /home/george/public_html/site/] internal redirect with /~george/site/.fiona/core/gateway.php [INTERNAL REDIRECT]
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#21103668/initial] (3) [perdir /home/george/public_html/site/] applying pattern '^.fiona/([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri 'redirect:/~george/site/.fiona/core/gateway.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#21103668/initial] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri 'redirect:/~george/site/.fiona/core/gateway.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#21103668/initial] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-zA-Z0-9_-] )(.php)?$' to uri 'redirect:/~george/site/.fiona/core/gateway.php'
127.0.0.1 - - [05/Oct/2011:08:47:37 --0400] [localhost/sid#20f41ce8][rid#21103668/initial] (1) [perdir /home/george/public_html/site/] pass through redirect:/~george/site/.fiona/core/gateway.php  

localhost/~george/site/login.php

 127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/login.php -> login.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] applying pattern '^.fiona/([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri 'login.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/login.php -> login.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri 'login.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/login.php -> login.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-zA-Z0-9_-] )(.php)?$' to uri 'login.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (4) [perdir /home/george/public_html/site/] RewriteCond: input='/~george/site/login.php' pattern='!.fiona/core/gateway.php' => matched
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (2) [perdir /home/george/public_html/site/] rewrite 'login.php' -> '.fiona/core/gateway.php?destination=login.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) split uri=.fiona/core/gateway.php?destination=login.php -> uri=.fiona/core/gateway.php, args=destination=login.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (3) [perdir /home/george/public_html/site/] add per-dir prefix: .fiona/core/gateway.php -> /home/george/public_html/site/.fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (2) [perdir /home/george/public_html/site/] trying to replace prefix /home/george/public_html/site/ with /~george/site/
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (5) strip matching prefix: /home/george/public_html/site/.fiona/core/gateway.php -> .fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (4) add subst prefix: .fiona/core/gateway.php -> /~george/site/.fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224bf668/initial] (1) [perdir /home/george/public_html/site/] internal redirect with /~george/site/.fiona/core/gateway.php [INTERNAL REDIRECT]
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/.fiona/core/gateway.php -> .fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (3) [perdir /home/george/public_html/site/] applying pattern '^.fiona/([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri '.fiona/core/gateway.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (4) [perdir /home/george/public_html/site/] RewriteCond: input='/~george/site/.fiona/core/gateway.php' pattern='!.fiona/core/gateway.php' => not-matched
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/.fiona/core/gateway.php -> .fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-z] )/([a-zA-Z0-9_-] )(.php)?$' to uri '.fiona/core/gateway.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (3) [perdir /home/george/public_html/site/] strip per-dir prefix: /home/george/public_html/site/.fiona/core/gateway.php -> .fiona/core/gateway.php
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (3) [perdir /home/george/public_html/site/] applying pattern '^([a-zA-Z0-9_-] )(.php)?$' to uri '.fiona/core/gateway.php'
127.0.0.1 - - [05/Oct/2011:08:58:18 --0400] [localhost/sid#222fdce8][rid#224c97b8/initial/redir#1] (1) [perdir /home/george/public_html/site/] pass through /home/george/public_html/site/.fiona/core/gateway.php  

Ссылки без .php расширения, похоже, успешно выполняют первоначальное перенаправление, однако по какой-то причине они, похоже, не могут перенаправить на абсолютный путь.

Я ни в коем случае не эксперт по mod_rewrite, поэтому здесь вполне могут быть другие проблемы. Любые идеи были бы замечательными.

РЕДАКТИРОВАТЬ Основываясь на ответе Мариуса, я полагаю, что я сузил это до проблемы с mod_userdir в сочетании с mod_rewrite. Перемещение сайта в /var/www решает проблему. Я все равно хотел бы, чтобы это работало в моем каталоге public_html.

РЕДАКТИРОВАТЬ Мариус подводит меня ближе к решению в разрешенных сайтах. Оказывается, проблема заключалась в том, что MultiViews (позволяет apache интерпретировать индекс как index.php ) не был включен для пользовательских каталогов. Добавление следующего к моим сайтам по умолчанию включено (/etc/apache2/sites-enabled/000-default) решило проблему с расширениями .php, но отключает mod_rewrite.

 <Directory /home/*/public_html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>   

Все мои сайты включены следующим образом

 <VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    <Directory /home/*/public_html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options  ExecCGI -MultiViews  SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>  

Ответ №1:

Я видел много таких проблем при использовании модуля «userdir» (модуль, который позволяет использовать ~username). Не могли бы вы попробовать то же самое с «обычным» каталогом, который не использует модуль userdir?

Просто заново создайте свой сайт со следующей структурой:

мариус@debiansrv:~/public_html/htaccesstest$ find ./.фиона ./.фиона/ядро ./.fiona/core/gateway.php ./.htaccess

Здесь файл htaccess на 100% совпадает с вашим, и он работает нормально. Вы можете проверить это здесь: http://home.goodworkaround.com /~мариус/htaccesstest/

Вы используете «.fiona» в качестве имени папки? Я подозреваю, что вы можете использовать слово «фиона». Кроме того, если это не так, вам следует вставить настройки сайта из Apache.

Комментарии:

1. Переход в /var/www определенно решает проблему. Для верности я также попытался перейти в /var/www/site, который также работает. Проблема, по-видимому, связана с mod_userdir в сочетании с mod_rewrite. Учитывая, что мне нужно поддерживать несколько веб-сайтов для нескольких разработчиков, я бы очень хотел, чтобы это работало с mod_userdir, если это вообще возможно.

2. Просто отредактировал свой пост с некоторой мыслью. Вы можете взглянуть на это.

3. Путь на самом деле .fiona . Я изучу свои настройки Apache и опубликую их.

4. Включенные сайты действительно были проблемой. Оказывается, мне не хватало MultiViews из public_html и .php был необходим для выполнения любого скрипта. Если вы отредактируете свой ответ, чтобы включить решение, я соглашусь.

5. Или, возможно, нет. «AllowOverride None» отключает mod_rewrite, но исправляет проблему с расширениями .php. «AllowOverride all» возвращает mod_rewrite в рабочее состояние, но прерывает мультивидения.

Ответ №2:

Оказывается, проблема была в файле с поддержкой моих сайтов. Очевидно, пользовательские каталоги не были настроены должным образом, чтобы позволить mod_rewrite работать. Копирование настроек виртуального хоста для /var/www/ с незначительными изменениями решило проблему.

 <Directory /home/*/public_html>
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    allow from all
</Directory>  

Ответ №3:

Он будет искать, какой базовый каталог, в котором вы размещаете файлы, находится относительно URL. Так что, если ваш сайт на самом деле на http://example.com /~george/site/, ваша база перезаписи будет правильной. После этого он будет искать что-то в этом каталоге, а затем, основываясь на ваших правилах, в RewriteBase/.fiona/core/gateway.php , который он не может найти. Я считаю, что если вы поместите .каталог fiona в site/, он должен работать.

Комментарии:

1. Хм .. похоже, проблема не в этом (index.php загружается с помощью /~george/site/ без проблем). Я попробовал ~george/site, /home/george/public_html/site и /home/george/site . Все генерируют «Внутреннюю ошибку сервера»

2. Извините, я не знаю, почему я не думал о том, что RewriteBase относится к URL. Поэтому вам придется определить его на основе вашей папки public_html в качестве корневой папки. Так что, если ваш фактический сайт находится на example.com/site , ваша база перезаписи должна быть /site/ . Отредактировал мой ответ, чтобы он был более подходящим

3. Если бы я собирался перейти непосредственно к gateway.php файл, какой адрес я должен был бы ввести?

4. В браузере URL-адрес будет localhost/~george/peerscout/.fiona/core/gateway.php