После обновления моего удаленного сервера до Ubuntu 14.04 (Apache 2.4) я не могу использовать свой предыдущий формат, в котором я мог бы запрашивать URI без вызова расширений файлов, вроде того, как страницы вызываются в такой структуре, как CodeIgniter.
Когда я звоню http://example.com/about Звоню about.php. Это работало в Ubuntu 12.04, но теперь страница не найдена.
Это все еще работает на моем локальном компьютере, который все еще 12.04, поэтому я не считаю, что это проблема .htaccess, и не думаю, что это проблема с файлами, доступными для сайтов. Кроме того, эта версия контролируется с помощью git, поэтому все почти то же самое, за исключением пары Vars, которые вызывают имя сайта и пути к файлам. - ИСПРАВЛЕНИЕ: это проблема .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>
КОНЕЦ 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
В некоторой степени это работает. Проблема, с которой я столкнулся, заключается в том, что при переходе к корневому каталогу документа -> example.com теперь просто отображается индекс всех файлов и каталогов вместо содержимого.
Проблема заключается в файле .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