Используйте mod_rewrite для удаления расширения .php и очистки URL-адресов GET одновременно

Это то, что я пробовал до сих пор:

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule (.*) $1.php [L] RewriteCond %{QUERY_STRING} ^id=([0-9]{1})$ RewriteRule ^article\.php$ /article/%1 [L] 

В принципе, первый набор правил преобразует URL-адреса из something.php в нечто.

Предполагается, что второй набор правил заменит все, что имеет article.php? Id = NUMBER в / article / NUMBER.

Отчеты Apache:

 AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. 

The second set of rules is supposed to replace anything that has article.php?id=NUMBER in it into /article/NUMBER.

Я верю, что вы изменили правила.

Вместо этого попробуйте использовать этот код:

 RewriteEngine On RewriteBase /mellori/ # external redirect from actual URL to pretty one RewriteCond %{THE_REQUEST} /article\.php\?id=([^\s&]+) [NC] RewriteRule ^ article/%1? [R=302,L] # internally rewrites /article/123 to article.php?id=123 RewriteRule ^article/([0-9]+)$ article.php?id=$1 [L,NC,QSA] # PHP hiding rule RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] 

Вы должны убедиться, что, когда вы сопоставляете с ^article\.php$ что это от фактического запроса, а не от URI, который был переписан предыдущим правилом. Таким образом, вы можете либо добавить проверку ENV для внутренней переадресации, либо сопоставить ее с `% {THE_REQUEST}.

Твой выбор:

 RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{QUERY_STRING} ^id=([0-9]{1})$ RewriteRule ^article\.php$ /article/%1 [L] 

или

 RewriteCond %{THE_REQUEST} \ /+article\.php\?id=([0-9]{1})(\ |$) RewriteRule ^ /article/%1 [L]