重写规则htaccess扰乱其他重写规则

时间:2015-01-27 16:08:50

标签: .htaccess mod-rewrite url-rewriting

我的网站上有一个页面,它是动态生成的,可以根据cityf参数列出所有商店,下面是重写规则,将其转换为SEO友好网址,并且效果非常好。

RewriteRule ^([^/.]+)/?$ /cityres?cityf=$1 [L]

我的网站上有一个博客页面,.htaccess如下所示转换SEO友好网址(http://example.com/title-of-blog

RewriteRule ^([^/.]+)/?$ /blogdetail?prmn=$1 [L]

现在我遇到的问题是,当有人访问blog页面然后链接http://example.com/title-of-blog而不是在页面上显示博客详情时,会显示我的错误消息No outlets near title-of-blog

我遇到的问题是Apache无法识别何时重写cityres页面以及何时重写blogdetail页面。

有人建议Make sure that each rule has a common prefix (e.g. /blog/page1 and /news/page2).,但我没有得到。

请问这里有什么建议吗?

<小时/> 编辑:
整个htaccess如下

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php
RewriteRule ^index\.php$ / [L,R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index
RewriteRule ^index\.php$ / [L,R=301]

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

# remove .php from URL
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L] 

# remove .html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)\.html$ /$1 [L,R=301] 

ErrorDocument 404 /error-page
ErrorDocument 403 /error-page 

RewriteRule ^food-([^-]*)-([^-]*)\.html$ /pdetail?res_id=$1&location=$2 [L]
RewriteRule ^foodies-([^-]*)-([^-]*)$ /pdetail_new?res_id=$1&location=$2 [L]
RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)/?$ /pdetail_ne?location=$1&res_id=$2&name=$3 [L]

RewriteRule ^blog/([^/.]+)/?$ /blogdetail_fm?prmn=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !cityres
RewriteRule ^([^/.]+)/?$ /cityres?cityf=$1 [L]

1 个答案:

答案 0 :(得分:2)

您的规则都与完全相同的模式匹配。因此,第一条规则将始终匹配,第二条规则不执行任何操作。

查看第一条规则:

RewriteRule ^([^/.]+)/?$ /blogdetail?prmn=$1 [L]

这匹配http://example.com/title-of-blog以及http://example.com/city-name

当你看到它时,你可以告诉blogdetail要处理哪些需要以及哪些需要由cityres处理,但正则表达式([^/.]+)将它们视为完全相同,并且两者都匹配。你的正则表达式并不知道区别,所以不管第一条规则是什么,两个URL都会被它匹配。

就像你说的,有人建议使用前缀。这样,正则表达式知道哪个是:

RewriteRule ^city/([^/.]+)/?$ /cityres?cityf=$1 [L]
RewriteRule ^blog/([^/.]+)/?$ /blogdetail?prmn=$1 [L]

您的网址将如下所示:

http://example.com/city/city-name
http://example.com/blog/title-of-blog

如果你真的挂断了没有添加前缀,你可以删除第二个前缀:

RewriteRule ^city/([^/.]+)/?$ /cityres?cityf=$1 [L]
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn=$1 [L]

所以你有:

http://example.com/city/city-name
http://example.com/title-of-blog

编辑:

您的500服务器错误是由规则循环引起的。您需要添加一个条件,以便他们不会保持匹配:

RewriteRule ^blog/([^/.]+)/?$ /blogdetail?prmn=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !cityres
RewriteRule ^([^/.]+)/?$ /cityres?cityf=$1 [L]