2011-12-21 2 views
1

Я получил следующее .htaccess работает отлично:How-to? Суета URL и игнорировать расширение .PHP с .htaccess

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

Это позволит мне писать URLs так:

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 

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


РЕШЕННЫЙ! Благодаря Ульриха Palha и Марио (не знал о заказе и ПОСЛЕДНЕГО [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] 
+0

Правило для контакта отображается в верхней части вашего .htaccess? Если нет, переместите его вверх, ниже RewriteEngine на –

+0

. Связано: http://stackoverflow.com/q/4026021/911182 – Herbert

+0

Проверьте это: http://stackoverflow.com/a/8371815/1044340 – Nonym

ответ

1

Это вопрос упорядочения. RewriteRules применяются в порядке, они отмечены в .htaccess
See Everything You Ever Wanted to Know about Mod_Rewrite Rules but Were Afraid to Ask?

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

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

RewriteRule ^(.*)$ ... 

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

0

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

в "/и т.д./apache2/сайты-доступны/по умолчанию" или "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] 

 Смежные вопросы

  • Нет связанных вопросов^_^