На моем рабочем сервере все в порядке: правила удаления расширений 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>