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