Чистые адреса Apache с поддержкой MultiView

Я пытаюсь разрешить Clean-Urls, имея MultiViews.

Все страницы, которые у меня есть, находятся в корневой папке.

Я пытаюсь добиться следующего:

(current-status -> what I am trying to achieve) 1. foo.com/services.php -> foo.com/services 2. foo.com/services == foo.com/services/ 3. foo.com/services.php/second-level/ == foo.com/services/second-level 

services не являются папкой, я взорвав $_SERVER['PATH_INFO'] и получаю данные о пути второго уровня.

Я уже достиг первого, но он терпит неудачу, когда я MultiViews , используя файл .htaccess и записывая переписывание.

 Options +Indexes +FollowSymLinks -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) $1.php [L] 

(Что, очевидно, не получится, так как это изменит запрос на услуги / second-level.php). Я знаю, что могу написать несколько перезаписи в .htaccess и условно перенаправить.

Но странный факт заключается в том, что в живой среде (совместный хостинг) он работает без файла .htaccess в корневой папке. Поскольку это общий хостинг, я не могу прочитать файл конфигурации.

Любые идеи о том, какую конфигурацию я должен изменить (в apache.conf или *.conf ) для достижения вышеуказанного?

Если это имеет значение, я использую Apache/2.2.22 , и эта проблема возникла после обновления.

Наконец я понял, как это решить.

Это работает, полностью удаляя файл .htaccess и меняя Virtual Directory чтобы сохранить следующие настройки:

 <VirtualHost *:80> ServerAdmin my-email-id ServerName foo.bar DocumentRoot /var/www/sites/foo/ <Directory /var/www/sites/foo/> Options +FollowSymLinks +MultiViews +Indexes DirectoryIndex index.php AddType application/x-httpd-php .php </Directory> </VirtualHost> 

Это помогает мне заставить все страницы работать, точно так же, как они работают на сервере, без каких-либо условий перезаписи.

Очистите URL-адреса без расширений .php и не используйте MultiView .

Гибкая веб-среда с поддержкой виртуального субдомена с использованием mod_userdir и mod_rewrite .

Позволяет выполнить следующую настройку URL-адреса

  • /var/www/sites/www/services.php
    • http://foo.bar/services.php/second-level/
    • http://foo.bar/services/second-level/
    • http://www.foo.bar/services/second-level/
    • http://127.0.0.1/services/second-level/
  • /var/www/sites/www/admin/login.php
    • http://foo.bar/admin/login.php/foo
    • http://foo.bar/admin/login/foo
    • http://www.foo.bar/admin/login/foo

Обратите внимание на или без добавления www. равна, потому что www. сегодня устарела … Но теперь вы можете размещать виртуальные субдомены слишком просто, добавив папку в /var/www/sites/ (помните DNS)

  • /var/www/sites/images/imgpass.php
    • http://img.ruphp.com/php/photo.jpg
    • http://img.ruphp.com/php/photo.jpg
    • http://img.ruphp.com/php/photo.jpg
    • http://127.0.0.1/~images/imgpass/photo.jpg

… и т. д., но пропускает, если существует / var / www / sites / images / imgpass.

Я использую многопользовательскую среду, в которой каждый пользователь имеет свой собственный webroot и субдомен.

/etc/apache2/sites-enabled/foo.bar.conf:

 <VirtualHost *:80> ServerAdmin my-email-id ServerName foo.bar ServerAlias 127.0.0.1 *.foo.bar # The default web-root if no subdomain is given DocumentRoot /var/www/sites/www/ UserDir /var/www/sites/* <Directory /var/www/sites/*> Order allow,deny Allow from all DirectoryIndex index.php index.html Options -MultiViews -Indexes # MultiViews workaround with 1 level subdir support RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} ^(\/var\/www\/sites\/.+(\/[^\/]+){2}).* RewriteCond %1.php -f RewriteRule ^\/var\/www\/sites\/(.+)((?:\/[^\/]+){2})(.*) /~$1$2.php$3 [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} ^(\/var\/www\/sites\/.+(\/[^\/]+){1}).* RewriteCond %1.php -f RewriteRule ^\/var\/www\/sites\/(.+)((?:\/[^\/]+){1})(.*) /~$1$2.php$3 [L] </Directory> # Force all requests in background to UserDir compatible requests RewriteEngine on RewriteMap lc int:tolower RewriteCond %{REQUEST_FILENAME} !^/~ RewriteCond %{HTTP_HOST} ^(www\.)?(.+)\.foo\.bar$ RewriteRule /(.*) /~${lc:%2}/$1 [PT,L] </VirtualHost> 

Этот код не является testet, потому что моя структура файловой системы полностью отличается от исходного. Поэтому я преобразовал свою конфигурацию «на лету», чтобы соответствовать этой структуре примера.

Обратите внимание, что конфигурация не завершена. Вы должны настроить его самостоятельно для своих нужд.

Хотя MultiViews можно использовать для этого, не добавляйте произвольный MIME-тип в файлы PHP, чтобы заставить их обслуживать MultiViews, например, принятый ответ и многие другие источники в Интернете:

 # Bad code - don't do this! Options +MultiViews AddType application/x-httpd-php .php 

Этот хак, который я подробно объясняю на https://stackoverflow.com/a/24598848/1709587 , кажется, работает, но фактически нарушен; он будет терпеть неудачу всякий раз, когда сервер получает запрос с заголовком Accept , который не включает */* .

Вместо этого чистым решением является использование директивы MultiviewsMatch чтобы сообщить Apache, что он действителен для работы .php файлов независимо от заголовков Accept и Accept-Language запроса:

 # Good code - use this instead! Options +MultiViews <Files "*.php"> MultiviewsMatch Any </Files>