使用mod_rewrite删除.php扩展名并同时清除GET URL

hyt*_*omo 7 php regex apache .htaccess mod-rewrite

这是我到现在为止所尝试的:

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]
Run Code Online (Sandbox Code Playgroud)

基本上,第一组规则将URL从something.php转换为某些内容.

第二组规则应该将其中包含article.php?id = NUM​​BER的任何内容替换为/ 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.
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 2

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]
Run Code Online (Sandbox Code Playgroud)