Невозможно запросить URL-адреса без расширения php-файла после обновления до Ubuntu 14.04
После обновления моего удаленного сервера до Ubuntu 14.04 (Apache 2.4) я не могу использовать свой предыдущий формат, где я мог запрашивать URI без вызова расширений файлов, например, как страницы вызываются в каркасе, таком как CodeIgniter.
Когда я звоню http://example.com/about я звоню about.php. Это работало в Ubuntu 12.04, но теперь страница не найдена.
Это все еще работает на моей локальной машине, которая все еще 12.04, поэтому я не считаю, что это проблема.htaccess, и при этом я не считаю, что это проблема с файлами, доступными на сайтах. Кроме того, это управление версиями с использованием git, так что все в значительной степени одинаково, за исключением пары Vars, которые называют имя сайта и пути к файлам. --CORRECTION: это проблема.conf, как указано ниже в моем ОБНОВЛЕНИИ.
У меня есть a2enmod (mode_rewrite).
Но для полноты я предоставлю файлы htaccess и sites-available;
/etc/apache2/sites-avaialable/example.net.conf:
<VirtualHost xxx.xxx.xxx.xxx:443>
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/domains/example.net/example.pem
SSLCertificateKeyFile /etc/apache2/ssl/domains/example.net/example.key
ServerAdmin webmaster@example.net
ServerName example.net
DirectoryIndex index.php index.html
DocumentRoot /var/www/html/example.net/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/html/example.net/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
# Log file locations
LogLevel warn
ErrorLog /var/www/html/example.net/logs/error.log
CustomLog /var/www/html/example.net/logs/access.log combined
</VirtualHost>
<VirtualHost *:80>
# Admin email, Server Name (domain name), and any aliases
ServerAdmin webmaster@example.net
ServerName example.net
ServerAlias www.example.net
# Index file and Document Root (where the public files are located)
DirectoryIndex index.php index.html
DocumentRoot /var/www/html/example.net/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/html/example.net/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
# Log file locations
LogLevel warn
ErrorLog /var/www/html/example.net/logs/error.log
CustomLog /var/www/html/example.net/logs/access.log combined
</VirtualHost>
END example.net.conf
Я должен отметить, что это то же самое на моей локальной машине, где успешно выполняются вызовы URI без расширения.
ОБНОВИТЬ:
Я удалил код в свой файл.htaccess, так как решил больше не использовать его, так как он не нужен и замедляет работу сервера.
В настоящее время у меня есть этот набор в моем файле example.net.conf внизу обеих (80 и 443) директив VirtualHost:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
Это работает в некоторой степени. Проблема, с которой я столкнулся, заключается в том, что при переходе к документу root -> example.com теперь просто отображается индекс всех файлов и каталогов вместо содержимого.
2 ответа
Проблема заключается в файле.conf (или.htaccess, если вы его используете).
В моем файле.conf было следующее:
<IfModule mod_rewrite.c>
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.php -f
RewriteRule ^(.*)$ $1.php [L]
</IfModule>
Я наконец-то узнал, что в Apache 2.2 вы должны добавить DOCUMENT_ROOT. Теперь работает следующее:
<IfModule mod_rewrite.c>
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f
RewriteRule ^(.*)$ $1.php [L]
</IfModule>
Я создал пример конфигурации, который может выполнять /testclass/testmethod без расширения.php
Для правил переписывания я следовал указаниям на codeigniter