У меня есть следующий .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]