#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