Не удается настроить mod_rewrite с XAMPP

Вопрос или проблема

Я пытаюсь включить mod_rewrite на установке XAMPP 5.6.3. Я следовал этим руководствам:

…и множество других, которые я смог найти в интернете. К сожалению, это не дало результатов.

У меня есть проект, который был разработан под Linux, он там работает идеально, с файлом .htaccess внутри:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

Я попробовал:

  1. Убедиться, что строка LoadModule rewrite_module modules/mod_rewrite.so не закомментирована в httpd.conf.
  2. Заменить AllowOverride none на AllowOverride all в httpd.conf (2 или 3 вхождения).
  3. Добавить AllowOverride all в секции <Directory>, которые я добавил в httpd-vhosts.conf, когда предыдущие шаги не сработали, на всякий случай.
  4. Перезапустить сервер после изменений №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.

Пожалуйста, сообщите, если у вас остались вопросы или если какая-либо из указанных рекомендаций не сработала.

Оцените материал
Добавить комментарий

Капча загружается...