Как я могу решить эту проблему в mod_rewrite, htaccess? - PullRequest
0 голосов
/ 08 сентября 2011

У меня проблема с удалением расширения php с помощью .htaccess. Вот правило:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php?$2 [QSA,L]

Эта ссылка sak.ps/overview хорошо работает для www.sak.ps/overview.php, но sak.ps/overview/1 для sak.ps/overview.php?flag=1 дает внутреннюю ошибку сервера!

Но в обоих случаях URL появляется на вкладке URL с расширением php.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

1. В вашем правиле $2 всегда будет пустым, поскольку у вас нет соответствующей группы захвата.

2. Ваше правило будет работать только для URL-адресовгде расширение .php добавляется в конец запрошенного URL.Для вашего второго примера URL вам понадобится отдельное правило.

RewriteEngine on

# 1) add .php file extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]

# 2) more complex case of adding .php extension
# will work with URLs like
# /overview/something/here => /overview/something.php?flag=here
# /overview/1 => /overview.php?flag=1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+)/([^/]+)$ $1.php?flag=$2 [QSA,L]

# 3) Another type of URL
# will work with URLs like
# /overview/something/here => /overview.php?flag=something/here
# /overview/1 => /overview.php?flag=1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^([^/]+)/(.+)$ $1.php?flag=$2 [QSA,L]

Я предоставил правила для 2 подходов:

  • Правило № 2 будет обрабатывать /overview/something/here=> /overview/something.php?flag=here (последний сегмент будет считаться параметром, а все предыдущие сегменты будут обрабатываться как имя файла);

  • Правило № 3 будет обрабатывать /overview/something/here => /overview.php?flag=something/here (первый сегмент будет обрабатываться как имя файла, а все остальные сегменты будут рассматриваться как параметр);

Перезапись /overview/1 => /overview.php?flag=1 может обрабатываться обоимиих (№ 2 или № 3).

0 голосов
/ 08 сентября 2011

Вам не нужно это ?$2 в конце вашего правила, флаг QSA автоматически добавит строку запроса по самому определению.

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

...