在匹配任何其他内容之前,Apache mod_rewrite匹配编号

时间:2015-01-01 10:05:11

标签: apache .htaccess mod-rewrite

我遇到这种情况,我需要先匹配数字才能匹配任何其他内容(其他参数包含字符),但我使用的规则不起作用并打破我的页面,即使我正在特别是它应该首先匹配数字([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=$1&id=$2 [QSA,L]

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

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

但是当我按照特定的顺序放置它们时,它总是匹配第一次重写,即使我不包含数字。

基本上,我需要确保当URI包含数字时,我需要将其重写为其他内容(id=),如果它还有其他数字,则应重写为{{1 }}

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以在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]+)/?$ $1.php?action=show&id=$2 [QSA,L]

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