Назад | Перейти на главную страницу

Конфигурация виртуального хоста и mod_rewrite - удаление расширения PHP и добавление косой черты

На моем рабочем сервере все в порядке: правила удаления расширений PHP и конечной косой черты в моем .htaccess файл.

Но локально это не работает (ну, частично, во всяком случае). Я запускаю Apache2 с виртуальным хостом для рассматриваемого сайта. Я решил не использовать .htaccess в этом случае и просто добавьте правила в httpd-vhosts.conf файл вместо этого, что, как я слышал, лучше, если это возможно на вашем сервере.

Виртуальный хост работает, и URL-адрес, который я использую для своего сайта, выглядит следующим образом:

devserver:9090

Вот мой httpd-vhosts.conf файл:

NameVirtualHost *:9090

# for stuff other than this site
<VirtualHost *:9090>
    ServerAdmin admin@localhost
    DocumentRoot "/opt/lampstack/apache2/htdocs"
    ServerName localhost
</VirtualHost>

# for site in question
<VirtualHost *:9090>
    ServerAdmin admin@localhost
    DocumentRoot "/opt/lampstack/apache2/htdocs/devserver"
    ServerName devserver

    <Directory "/opt/lampstack/apache2/htdocs/devserver">
        Options Indexes FollowSymLinks Includes
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    <IfModule rewrite_module>
        RewriteEngine ON    

        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME}.php -f
        RewriteRule (.*)/$ /$1.php

    </IfModule>

    # error docs
    ErrorDocument 404 /errors/404.php

</VirtualHost>

Проблема, с которой я столкнулся, заключается в том, что когда я захожу в каталоги на сайте, я получаю ошибку 404. Так, например, это:

devserver:9090/page.php

идет в

devserver:9090/page/

но при переходе в каталог (в котором index.php):

devserver:9090/dir/

выдает страницу с ошибкой 404.

Если я наберу devserver:9090/dir/index.php я получил devserver:9090/dir/index/ и содержимое, которое я хочу, появилось ...

Может ли кто-нибудь помочь мне с моими правилами перезаписи?

НОТА

Мой ответ ниже

50 баллов любому, кто может пролить дополнительный свет на этот ответ. Я начал баунти, а потом нашел свой ответ, но все еще учусь, поэтому любые хорошие советы могут стоить +50.

Возможно, кто-то получит более подробный ответ для этого конкретного случая, но в качестве более общего совета вы можете использовать RewriteLog и RewriteLogLevel директивы для получения подробной информации о том, какое правило обрабатывается и каков результат перезаписи.

Имея эту информацию, вы сможете найти отсутствующее правило или, по крайней мере, отправить нам вывод журнала, чтобы получить более подробную информацию.

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog

Я изменил это:

Options Indexes FollowSymLinks Includes

к этому:

Options Indexes FollowSymLinks MultiViews

и теперь он работает, как ожидалось ... Вот правило, которое я использовал для удаления расширения PHP:

<Directory "/opt/lampstack/apache2/htdocs/devserver">
    Options Indexes FollowSymLinks Includes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<IfModule rewrite_module>
    RewriteEngine ON    

    # remove PHP extension
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule (.*)/$ /$1.php

    # add trailing slash to all URLs
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(.*)/$
    RewriteRule ^(.*)$ http://www.example.com/$1/ [R=302,L]

</IfModule>