用于匹配任意PHP文件的RewriteRule

时间:2012-10-19 01:54:32

标签: .htaccess mod-rewrite

我对htaccess重写规则有些新意,并且过去几天一直在为这里发生的事情摸不着头脑。没有任何谷歌搜索似乎有帮助,所以希望有人知道答案。

我有一个可以访问的网站:

www.site.com
www.site.com/684
www.site.com/684/some-slug-name-here

所有这些方案都应转到index.php并传入可选的id=684slug=some-slug-name-here

哪种方法正常。

我的问题是我有一个单独的文件。现在它被称为admintagger.php - 但是当我把它称之为任何东西时它会失败。 21g12fjhg2349yf234f.php也存在同样的问题。

问题在于我希望能够从admintagger.php

访问www.site.com/admintagger

但它似乎与我的索引规则匹配,而是把我带到那里。

这是我的代码:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /


RewriteRule ^imagetagger$ /imagetagger.php [NC,QSA]
RewriteRule ^([0-9]+)/?(.*)?/?$ index.php?id=$1&slug=$2 [NC,L,QSA]

1 个答案:

答案 0 :(得分:1)

如果你想通过名称(无扩展名)任意访问php文件,那么你需要为它创建一般规则。但是你需要小心,否则你可能会重写对现有资源(如目录或slug)的合法请求。试试这个:

# make sure we aren't clobbering legit requests:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# see if appending a ".php" to the end of the request will map to an existing file
RewriteCond %{REQUEST_FILENAME}.php -f
# internally rewrite to include the .php
RewriteRule ^(.*)$ /$1.php [L]

然后你可以在那之后立即路由到index.php:

RewriteRule ^([0-9]+)/?(.*)?/?$ index.php?id=$1&slug=$2 [NC,L,QSA]

虽然您可能最好为3个案例中的每个案例创建一个单独的规则:

RewriteRule ^([0-9]+)/([^/]+)/?$ /index.php?id=$1&slug=$2 [NC,L,QSA]
RewriteRule ^([0-9]+)/?$ /index.php?id=$1 [NC,L,QSA]
RewriteRule ^$ /index.php [L]