Как? URL тщеславия и игнорировать расширение .PHP с .htaccess

У меня есть следующий .htaccess:

RewriteEngine on RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule .* - [L] RewriteRule ^(.*)$ http://www.mysite.com/mypage.php?u=$1 [NC] 

Это позволит мне писать URL-адреса следующим образом:

 http://www.mysite.com/peter => http://www.mysite.com/mypage.php?u=peter 

Но что, если я хочу иметь правило aditional, чтобы не писать расширение .php для существующих файлов?

 http://www.mysite.com/contact (contact.php exists on file) 

Я попытался добавить это в свой текущий htaccess (но не работает):

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

Другими словами, я хотел бы иметь URL-адрес тщеславия и игнорировать расширение .php в том же .htaccess.


РЕШИТЬ! Спасибо Ульриху Пале и Марио (не знали о заказе и флаг LAST [L]!

 RewriteEngine on # Unless directory, remove trailing slash RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/$ http://www.mysite.com/$1 [R=301,L] # Redirect external .php requests to extensionless url RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ RewriteRule ^(.+)\.php$ http://www.mysite.com/$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule .* - [L] RewriteRule ^(.*)$ http://www.mysite.com/mypage.php?u=$1 [NC] 

Это вопрос заказа. RewriteRules применяются в том порядке, в котором они отмечены в .htaccess
Смотрите все, что вы когда-либо хотели узнать о правилах Mod_Rewrite, но боялись спросить?

Просто добавьте новый блок в качестве первого оператора перезаписи, добавьте флаг [LAST] , и он должен работать.

Это правило работает безоговорочно (не защищено никаким RewriteCond), поэтому всегда должно быть последним из всех RewriteRules:

  RewriteRule ^(.*)$ ... 

(И все предыдущие RewriteRules должны предпочтительно иметь флаг [L] . У вас есть обходной путь.)

Для меня этот код работает:

в " / etc / apache2 / sites-available / default " или " httpd.conf "

вы должны иметь (по крайней мере) эти параметры в каталоге по умолчанию

 ... <Directory /> ... Options FollowSymLinks AllowOverride All ... </Directory> ... 

ИЛИ в каталоге сайта для сайта

 ... <Directory "/var/www/my-site"> ... Options FollowSymLinks AllowOverride All ... </Directory> ... 

и создайте или отредактируйте « .htacces » в каталоге сайта (например, «/var/www/my-site/.htaccess») и добавьте этот код:

 AddType application/x-httpd-php htm html php AddHandler application/x-httpd-php .htm .html RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]