mod_rewrite的新手

时间:2011-04-20 14:56:23

标签: php mod-rewrite

我是初次使用mod_rewrite并且可以提供一些帮助,这是我到目前为止已经成功完成的工作

Options +FollowSymlinks
RewriteEngine On 

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)/(.*)/pid/(.*)/(.*)$ /$1/$2.php?np=$3 [NC]
RewriteRule ^news/article/(.*)$ /news/details.php?newstag=$1 [NC]

这适用于以下链接: http://www.mydomain.co.uk/about/about/pid/2/About (文件夹/文件名/ pid /页面ID /页面标题

但没有,我无法让它发挥作用。

http://www.mydomain.co.uk/index/pid/1/Welcome-to-this-site (文件名/ pid /页面ID /标题)

有没有办法让文件夹选项^(。*)/ optional?

1 个答案:

答案 0 :(得分:0)

要使文件夹选项可选,我会将规则分为两部分:

RewriteRule ^(.*)/(.*)/pid/(.*)/(.*)$ /$1/$2.php?np=$3 [NC]
RewriteRule ^(.*)/pid/(.*)/(.*)$ /$1.php?np=$2 [NC]

请注意“。”匹配所有内容,包括“/”,因此,我猜两个规则都匹配一个URL,如: http://www.mydomain.co.uk/one/two/three/four/pid/1/Welcome-to-this-site

$ 1的地方是:“一/二/三”和$ 2:“四”。

要避免这种情况,请使用[^ /]而不是“。”:

RewriteRule ^([^/]*)/([^/]*)/pid/([^/]*)/([^/]*)$ /$1/$2.php?np=$3 [NC]
RewriteRule ^([^/]*)/pid/([^/]*)/([^/]*)$ /$1.php?np=$2 [NC]

如果您不关心可访问的文件夹深度,则以下规则应该足够并且在有和没有foldername的情况下都匹配:

RewriteRule ^(.*)/pid/(.*)/(.*)$ /$1.php?np=$2 [NC]