- Вопрос или проблема
- httpd.conf:
- httpd-vhosts.conf:
- низ error.log:
- Обновление
- Ответ или решение
- 1. Убедитесь, что модуль mod_rewrite включен
- 2. Настройка AllowOverride
- 3. Проверьте файл .htaccess
- 4. Обратите внимание на права доступа
- 5. Перезапустите Apache
- 6. Проверьте журнал ошибок
- 7. Использование директивы RewriteBase
- Заключение
Вопрос или проблема
Я пытаюсь включить mod_rewrite на установке XAMPP 5.6.3. Я следовал этим руководствам:
- http://www.leonardaustin.com/blog/technical/enable-mod_rewrite-in-xampp/
- http://www.lancelhoff.com/enabling-htaccess-in-apache-on-windows/
- https://apple.stackexchange.com/questions/47526/enable-url-rewriting-mod-rewrite-using-htaccess-files-in-sites-on-lion
…и множество других, которые я смог найти в интернете. К сожалению, это не дало результатов.
У меня есть проект, который был разработан под Linux, он там работает идеально, с файлом .htaccess
внутри:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
Я попробовал:
- Убедиться, что строка
LoadModule rewrite_module modules/mod_rewrite.so
не закомментирована вhttpd.conf
. - Заменить
AllowOverride none
наAllowOverride all
вhttpd.conf
(2 или 3 вхождения). - Добавить
AllowOverride all
в секции<Directory>
, которые я добавил вhttpd-vhosts.conf
, когда предыдущие шаги не сработали, на всякий случай. - Перезапустить сервер после изменений №2 и №3.
Я пытаюсь получить доступ к URL в директории с файлом .htaccess, но ни один из них, вероятно, не переписывается, и все дают 404. Доступ к файлу, на который они должны переписываться, возможен и не вызывает ошибок. Доступ к .htaccess
сам по себе дает 403.
Я также попробовал добавить:
RewriteLog "C:/XAMPP/apache/logs/rewrite.log"
RewriteLogLevel 3
…как в httpd.conf
, так и в httpd-vhosts.conf
, иногда без RewriteLog
, но когда я это делаю, Apache отказывается запускаться – иногда выдает общие сообщения об ошибках в консоль XAMPP, иногда просто зависает. Однако ничего не записывается в error.log
. Таким образом, нет вывода от mod_rewrite
. Однако phpinfo()
показывает, что загружены следующие модули:
core mod_win32 mpm_winnt http_core mod_so mod_access_compat mod_actions mod_alias mod_allowmethods mod_asis mod_auth_basic mod_authn_core mod_authn_file mod_authz_core mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cgi mod_dav_lock mod_dir mod_env mod_headers mod_include mod_info mod_isapi mod_log_config mod_cache_disk mod_mime mod_negotiation mod_proxy mod_proxy_ajp mod_rewrite mod_setenvif mod_socache_shmcb mod_ssl mod_status mod_version mod_php5
Так что он должен быть в более-менее рабочем состоянии.
Это сводит меня с ума. Пожалуйста, помогите.
Ниже приведены все содержимое того, что выглядит хоть как-то полезным:
httpd.conf:
ServerRoot "C:/XAMPP/apache"
Listen 80
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dav_lock_module modules/mod_dav_lock.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule info_module modules/mod_info.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule cache_disk_module modules/mod_cache_disk.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule status_module modules/mod_status.so
LoadModule version_module modules/mod_version.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin postmaster@localhost
ServerName localhost:80
<Directory />
AllowOverride all
Require all denied
</Directory>
DocumentRoot "C:/XAMPP/htdocs"
<Directory "C:/XAMPP/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.php index.pl index.cgi index.asp index.shtml index.html index.htm \
default.php default.pl default.cgi default.asp default.shtml default.html default.htm \
home.php home.pl home.cgi home.asp home.shtml home.html home.htm
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error.log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access.log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "C:/XAMPP/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "C:/XAMPP/cgi-bin">
AllowOverride All
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddHandler cgi-script .cgi .pl .asp
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
<IfModule mime_magic_module>
MIMEMagicFile "conf/magic"
</IfModule>
Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-multilang-errordoc.conf
Include conf/extra/httpd-autoindex.conf
Include conf/extra/httpd-languages.conf
Include conf/extra/httpd-userdir.conf
Include conf/extra/httpd-info.conf
Include conf/extra/httpd-vhosts.conf
Include "conf/extra/httpd-proxy.conf"
Include "conf/extra/httpd-default.conf"
Include "conf/extra/httpd-xampp.conf"
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
Include conf/extra/httpd-ssl.conf
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
AcceptFilter http none
<IfModule mod_proxy.c>
<IfModule mod_proxy_ajp.c>
Include "conf/extra/httpd-ajp.conf"
</IfModule>
</IfModule>
httpd-vhosts.conf:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "S:/efit_rails4/public"
Alias /remote-control "S:/ssm-misc/remote-control"
<Directory "S:/efit_rails4/public">
Require all granted
AllowOverride All
</Directory>
<Directory "S:/ssm-misc/remote-control">
Require all granted
AllowOverride All
</Directory>
ServerName SSM
</VirtualHost>
низ error.log:
[Fri Nov 28 05:43:56.875099 2014] [mpm_winnt:notice] [pid 9780:tid 380] AH00456: Apache Lounge VC11 Server built: Jul 17 2014 11:50:08
[Fri Nov 28 05:43:56.875099 2014] [core:notice] [pid 9780:tid 380] AH00094: Command line: 'c:\\xampp\\apache\\bin\\httpd.exe -d C:/XAMPP/apache'
[Fri Nov 28 05:43:56.876100 2014] [mpm_winnt:notice] [pid 9780:tid 380] AH00418: Parent: Created child process 8276
[Fri Nov 28 05:43:57.155297 2014] [ssl:warn] [pid 8276:tid 384] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
[Fri Nov 28 05:43:57.255380 2014] [ssl:warn] [pid 8276:tid 384] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
[Fri Nov 28 05:43:57.280385 2014] [mpm_winnt:notice] [pid 8276:tid 384] AH00354: Child: Starting 150 worker threads.
[Fri Nov 28 05:44:18.865136 2014] [authz_core:error] [pid 8276:tid 1728] [client 127.0.0.1:63898] AH01630: client denied by server configuration: S:/ssm-misc/remote-control/api/.htaccess
Обновление
После некоторой убедительности (и помощи от @AD7six) мне удалось получить вывод отладки. Похоже, есть новый способ настройки этого:
RewriteBase /remote-control/api/
Меня смущает, что модуль переписывания, похоже, правильно переписывает URL и затем сразу же выдает 404. Я также попробовал поэкспериментировать и обнаружил, что если я добавлю явную базу для переписывания, равную текущей директории, например:
RewriteBase /remote-control/api/
Переписывание вроде как работает – я получаю index.php, хотя у меня есть другие ошибки, поэтому я не могу точно подтвердить, действительно ли это работает. Однако я не совсем удовлетворен этим решением. Кроме того, вывод отладки в этом случае несколько длиннее, как будто он делает еще один проход или что-то в этом роде. И в конце концов, это приводит к идентичному имени файла, но без 404:
[Thu Dec 04 00:37:31.417478 2014] [rewrite:trace3] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d4118/initial] [perdir S:/ssm-misc/remote-control/api/] strip per-dir prefix: S:/ssm-misc/remote-control/api/session -> session
[Thu Dec 04 00:37:31.417478 2014] [rewrite:trace3] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d4118/initial] [perdir S:/ssm-misc/remote-control/api/] applying pattern '^' to uri 'session'
[Thu Dec 04 00:37:31.417478 2014] [rewrite:trace2] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d4118/initial] [perdir S:/ssm-misc/remote-control/api/] rewrite 'session' -> 'index.php'
[Thu Dec 04 00:37:31.417478 2014] [rewrite:trace3] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d4118/initial] [perdir S:/ssm-misc/remote-control/api/] add per-dir prefix: index.php -> S:/ssm-misc/remote-control/api/index.php
[Thu Dec 04 00:37:31.417478 2014] [rewrite:trace2] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d4118/initial] [perdir S:/ssm-misc/remote-control/api/] trying to replace prefix S:/ssm-misc/remote-control/api/ with /remote-control/api/
[Thu Dec 04 00:37:31.418478 2014] [rewrite:trace1] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d4118/initial] [perdir S:/ssm-misc/remote-control/api/] internal redirect with /remote-control/api/index.php [INTERNAL REDIRECT]
[Thu Dec 04 00:37:31.418478 2014] [rewrite:trace3] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d7bb8/initial/redir#1] [perdir S:/ssm-misc/remote-control/api/] strip per-dir prefix: S:/ssm-misc/remote-control/api/index.php -> index.php
[Thu Dec 04 00:37:31.418478 2014] [rewrite:trace3] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d7bb8/initial/redir#1] [perdir S:/ssm-misc/remote-control/api/] applying pattern '^' to uri 'index.php'
[Thu Dec 04 00:37:31.418478 2014] [rewrite:trace1] [pid 5636:tid 1728] mod_rewrite.c(475): [client ::1:58668] ::1 - - [localhost/sid#f51730][rid#88d7bb8/initial/redir#1] [perdir S:/ssm-misc/remote-control/api/] pass through S:/ssm-misc/remote-control/api/index.php
Что могло здесь происходить?
Ответ или решение
Чтобы настроить модуль mod_rewrite
в вашей установке XAMPP версии 5.6.3, выполните следующие шаги:
1. Убедитесь, что модуль mod_rewrite
включен
Откройте файл httpd.conf
, который находится по пути C:/XAMPP/apache/conf/httpd.conf
. Найдите следующую строку и убедитесь, что она не закомментирована (т.е. перед ней нет #
):
LoadModule rewrite_module modules/mod_rewrite.so
2. Настройка AllowOverride
В этом же файле httpd.conf
найдите секцию <Directory "C:/XAMPP/htdocs">
и убедитесь, что у вас стоит AllowOverride All
:
<Directory "C:/XAMPP/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
Если у вас есть настройки в файле httpd-vhosts.conf
, убедитесь, что там также установлено:
<Directory "S:/efit_rails4/public">
AllowOverride All
Require all granted
</Directory>
3. Проверьте файл .htaccess
Ваш файл .htaccess
должен содержать правильные правила переписывания. Приведенный вами код выглядит хорошо, но давайте немного изменим его:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Это правило проверяет, что запрашиваемый файл или директория не существуют, и затем перенаправляет всех пользователей на index.php
.
4. Обратите внимание на права доступа
Ошибка 403, которую вы видите при попытке доступа к файлу .htaccess
, может быть связана с тем, что вы не можете его прочитать. Убедитесь, что у вас есть правильные права доступа к этому файлу. В Windows это можно проверить через свойства файла.
5. Перезапустите Apache
После внесения изменений в конфигурационные файлы обязательно перезапустите сервер Apache через XAMPP Control Panel.
6. Проверьте журнал ошибок
Если все равно возникает проблема с 404, проверьте файл журнала ошибок, который находится в C:/XAMPP/apache/logs/error.log
. Это может дать вам больше информации о том, что именно идет не так.
7. Использование директивы RewriteBase
Если после всех вышеуказанных шагов проблема все еще сохраняется, попробуйте установить директиву RewriteBase
в вашем файле .htaccess
:
RewriteBase /remote-control/api/
Заключение
Если вы выполните все эти шаги и все равно столкнетесь с ошибками, возможно, потребуется дополнительно проверить маршруты в вашем коде приложения. Иногда проблемы могут быть связаны с неправильными путями в самом приложении, а не с настройками Apache.
Пожалуйста, сообщите, если у вас остались вопросы или если какая-либо из указанных рекомендаций не сработала.