2013-10-02 3 views
0

У меня есть следующий код в моем файле .htaccess:тщеславие URL-адрес и скрипты расширений файлов интерферирующего вместе

Options +FollowSymLinks -MultiViews 
RewriteEngine On 
RewriteBase/

#vanity URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA] 
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*) 
RewriteRule^/%1?%2 [L,R=301] 

#remove file extensions 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 


ErrorDocument 400 /404.php 
ErrorDocument 401 /404.php 
ErrorDocument 403 /404.php 
ErrorDocument 404 /404.php 
ErrorDocument 500 /404.php 

<Files .htaccess> 
order allow,deny 
deny from all 
</Files> 

Что касается тщеславия адресов, он отлично работает, но когда дело доходит до удаления PHP расширений в то конец URL-адресов, не работает:

1. если я вхожу mysite.com/home.php, я попадаю в home.php но расширение до сих пор существует в адресной строке.

2. если я вхожу mysite.com/home, я попадаю в моей пользовательской странице ошибки, потому что home не имя пользователя моя база данных.

Как я могу исправить 1. и 2.?

ответ

1

Вам необходимо сделать проверку расширения php до имя пользователя маршрутизации. Это, конечно, сломается, если у вас будет php-файл, такой же, как и имя пользователя, но это не так, если вы не префикс всех ваших имен пользователей.

Так поменять свои правила вокруг и добавить еще одно правило для перенаправления прямых доступов к PHP файлов:

# we don't want to mess with /profile.php access because there's a rule later that deals with that 
RewriteCond %{REQUEST_URI} !^/profile\.php 
RewriteCond %{THE_REQUEST} \ /(.*)\.php(\?|\ |$) 
RewriteRule^/%1 [L,R=301] 

# add file extensions back to URI 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

#vanity URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA] 
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*) 
RewriteRule^/%1?%2 [L,R=301] 

Что я имею в виду приставкой для пользователей что-то вроде этого:

http://mysite.com/u/foobar 

Здесь /u/ указывает, что «foobar» - это пользователь, а не php-страница. Чтобы сделать это, вам нужно добавить несколько изменений в раздел «# тщеславия URL»:

#vanity URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^u/([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA] 
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*) 
RewriteRule^/u/%1?%2 [L,R=301] 

по существу в том числе /u/ в рамках матча и перенаправления.

+0

+1 для этого хорошего объяснения! Я собираюсь блокировать имена пользователей, например, о настройках и т. Д., Поэтому мне не нужен префикс. Ваш код, похоже, работает для страниц, но он не работает с моими файлами действий: мои формы больше не отправляются. если home.php имеет форму с файлом действия формы «signup.php», я перенаправляюсь на mysite.com/signup, а затем ничего. Любые идеи почему? –

+0

Возможно, было бы проще удалить расширения файлов только для некоторых указанных URL-адресов, таких как: home.php и account.php. Возможно ли это с помощью htaccess? –

+1

@ChHr в первом правиле '(. *)' Должно быть '(home | account)', а второе правило '([^ \.] +)' Должно быть '(home | account) '. –