Apache mod_rewrite 在匹配任何其他内容之前先匹配数字

Apache mod_rewrite match number before matching anything else

我遇到这种情况,我需要先匹配数字,然后再匹配任何其他内容(其他包含字符的参数),但我使用的规则不起作用并破坏了我的页面,即使我很明确它应该首先匹配数字 ([0-9]+)

因此,例如,这是具有优先权的:

http://example.com/page/1

在此之前:

http://example.com/page/create

第一个显然会使用与第二个不同的参数。如果不重写任何东西,它可能看起来像这样:

http://example.com/page.php?action=show&id=1

http://example.com/page.php?action=create

因此,从重写的角度来看,这些 URL 看起来很相似,但与参数一起使用时却不同。


所以在我的真实情况下,我有这些规则:

RewriteCond {REQUEST_FILENAME} !-f
RewriteCond {REQUEST_FILENAME} !-d
RewriteRule ^(.+)/([0-9]+)$ page.php?uri=&id= [QSA,L]

RewriteCond {REQUEST_FILENAME} !-f
RewriteCond {REQUEST_FILENAME} !-d
RewriteRule ^(.+)/(.+)$ page.php?uri=&action= [QSA,L]

RewriteCond {REQUEST_FILENAME} !-f
RewriteCond {REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ page.php?uri= [QSA,L]

但是当我将它们按照非常特殊的顺序排列时,它总是与第一次重写匹配,即使我不包括数字。

所以基本上,我需要确保当 URI 包含数字时,我需要将其重写为其他内容 (id=),如果除了数字之外还有其他任何内容,则应重写为 action=.

我怎样才能做到这一点?

您可以在 DOCUMENT_ROOT/.htaccess 文件中使用此代码:

RewriteEngine On
RewriteBase /

# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^([^/]+)/([0-9]+)/?$ .php?action=show&id= [QSA,L]

RewriteRule ^([^/]+)/([^/]+)/?$ .php?action= [QSA,L]