重写规则 htaccess 干扰其他重写规则
Rewrite rule htaccess disturbing other rewrite rules
我的网站上有一个页面正在动态生成,以根据 cityf
参数列出所有网点,下面是将其转换为 SEO 友好 URL 的重写规则,并且运行良好嗯。
RewriteRule ^([^/.]+)/?$ /cityres?cityf= [L]
我的网站上有一个博客页面,.htaccess 如下转换为 SEO 友好 URL (http://example.com/title-of-blog
)
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn= [L]
现在我面临的问题是,当有人访问 blog
页面时,link 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/ [L,R=301]
# remove .php from URL
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) \.php [L]
# remove .html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)\.html$ / [L,R=301]
ErrorDocument 404 /error-page
ErrorDocument 403 /error-page
RewriteRule ^food-([^-]*)-([^-]*)\.html$ /pdetail?res_id=&location= [L]
RewriteRule ^foodies-([^-]*)-([^-]*)$ /pdetail_new?res_id=&location= [L]
RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)/?$ /pdetail_ne?location=&res_id=&name= [L]
RewriteRule ^blog/([^/.]+)/?$ /blogdetail_fm?prmn= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond !cityres
RewriteRule ^([^/.]+)/?$ /cityres?cityf= [L]
您的两个规则匹配完全相同的模式。因此,第一个规则将始终匹配,第二个规则不执行任何操作。
查看第一条规则:
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn= [L]
这匹配 http://example.com/title-of-blog
以及 http://example.com/city-name
当你查看它时,你可以分辨出哪些需要由 blogdetail 处理,哪些需要由 cityres 处理,但正则表达式 ([^/.]+)
将它们视为完全相同,并匹配两者。您的正则表达式不知道其中的区别,因此无论第一条规则是什么,URL 都将与之匹配。
就像你说的,有人建议使用前缀。这样,正则表达式 知道 哪个是:
RewriteRule ^city/([^/.]+)/?$ /cityres?cityf= [L]
RewriteRule ^blog/([^/.]+)/?$ /blogdetail?prmn= [L]
你的 URL 看起来像:
http://example.com/city/city-name
http://example.com/blog/title-of-blog
如果你真的对不添加前缀挂断电话,你可以删除第二个前缀:
RewriteRule ^city/([^/.]+)/?$ /cityres?cityf= [L]
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn= [L]
所以你有:
http://example.com/city/city-name
http://example.com/title-of-blog
编辑:
您的 500 服务器错误是由规则循环引起的。您需要添加一个条件,以便它们不会一直匹配:
RewriteRule ^blog/([^/.]+)/?$ /blogdetail?prmn= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond !cityres
RewriteRule ^([^/.]+)/?$ /cityres?cityf= [L]
我的网站上有一个页面正在动态生成,以根据 cityf
参数列出所有网点,下面是将其转换为 SEO 友好 URL 的重写规则,并且运行良好嗯。
RewriteRule ^([^/.]+)/?$ /cityres?cityf= [L]
我的网站上有一个博客页面,.htaccess 如下转换为 SEO 友好 URL (http://example.com/title-of-blog
)
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn= [L]
现在我面临的问题是,当有人访问 blog
页面时,link 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/ [L,R=301]
# remove .php from URL
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) \.php [L]
# remove .html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)\.html$ / [L,R=301]
ErrorDocument 404 /error-page
ErrorDocument 403 /error-page
RewriteRule ^food-([^-]*)-([^-]*)\.html$ /pdetail?res_id=&location= [L]
RewriteRule ^foodies-([^-]*)-([^-]*)$ /pdetail_new?res_id=&location= [L]
RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)/?$ /pdetail_ne?location=&res_id=&name= [L]
RewriteRule ^blog/([^/.]+)/?$ /blogdetail_fm?prmn= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond !cityres
RewriteRule ^([^/.]+)/?$ /cityres?cityf= [L]
您的两个规则匹配完全相同的模式。因此,第一个规则将始终匹配,第二个规则不执行任何操作。
查看第一条规则:
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn= [L]
这匹配 http://example.com/title-of-blog
以及 http://example.com/city-name
当你查看它时,你可以分辨出哪些需要由 blogdetail 处理,哪些需要由 cityres 处理,但正则表达式 ([^/.]+)
将它们视为完全相同,并匹配两者。您的正则表达式不知道其中的区别,因此无论第一条规则是什么,URL 都将与之匹配。
就像你说的,有人建议使用前缀。这样,正则表达式 知道 哪个是:
RewriteRule ^city/([^/.]+)/?$ /cityres?cityf= [L]
RewriteRule ^blog/([^/.]+)/?$ /blogdetail?prmn= [L]
你的 URL 看起来像:
http://example.com/city/city-name
http://example.com/blog/title-of-blog
如果你真的对不添加前缀挂断电话,你可以删除第二个前缀:
RewriteRule ^city/([^/.]+)/?$ /cityres?cityf= [L]
RewriteRule ^([^/.]+)/?$ /blogdetail?prmn= [L]
所以你有:
http://example.com/city/city-name
http://example.com/title-of-blog
编辑:
您的 500 服务器错误是由规则循环引起的。您需要添加一个条件,以便它们不会一直匹配:
RewriteRule ^blog/([^/.]+)/?$ /blogdetail?prmn= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond !cityres
RewriteRule ^([^/.]+)/?$ /cityres?cityf= [L]