寻求特定.htaccess regex替换命令:URL格式重写技术咨询
看起来你是想用Apache的mod_rewrite来处理URL重写,之前的规则没生效是因为错把查询参数(QUERY_STRING)当成了路径部分来匹配,咱们来调整一下:
针对特定城市(比如Bozeman)的重写
如果只是要把Montana州下所有包含bozeman的PHP文件重定向到/montana/bozeman/index.php,可以用这条规则:
RewriteEngine On # 匹配/montana/下任何包含bozeman的.php文件,忽略大小写 RewriteRule ^montana/.*bozeman.*\.php$ /montana/bozeman/index.php [NC,L,R=301]
规则解释:
^montana/:匹配URL路径以montana/开头的部分.*bozeman.*:匹配中间包含bozeman的任意字符(.*表示任意长度的任意字符)\.php$:匹配以.php结尾的文件[NC]:忽略大小写(比如Bozeman、BOZEMAN都能匹配)[L]:表示这是最后一条规则,匹配后不再处理后续规则[R=301]:发送永久重定向的HTTP状态码,告诉搜索引擎更新索引;如果只是内部跳转不需要地址栏变化,可以去掉R=301,只保留[NC,L]
通用场景:匹配任意州+任意城市的重写
如果你的URL格式是/[州名]/[包含城市名的文件名].php,且城市名是用下划线和其他内容分隔的(比如city_somedata.php、somedata_city_xy.php),可以用捕获组来动态提取城市名:
RewriteEngine On # 匹配城市名被下划线包裹的情况(比如somedata_city_xy.php) RewriteRule ^([^/]+)/.*_(.+?)_.*\.php$ /$1/$2/index.php [NC,L,R=301] # 匹配城市名在文件名开头的情况(比如city_somedata.php) RewriteRule ^([^/]+)/(.+?)_.*\.php$ /$1/$2/index.php [NC,L,R=301] # 匹配城市名在文件名结尾的情况(比如somedata_city.php) RewriteRule ^([^/]+)/.*_(.+?)\.php$ /$1/$2/index.php [NC,L,R=301]
规则解释:
^([^/]+)/:捕获第一个路径段作为州名([^/]+表示匹配除了斜杠之外的任意字符).*_(.+?)_.*:非贪婪捕获被下划线包裹的城市名((.+?)避免过度匹配)/$1/$2/index.php:用捕获到的州名($1)和城市名($2)拼接成目标URL
注意事项:
- 确保你的服务器已经启用了mod_rewrite模块(Apache下可以通过
a2enmod rewrite命令开启) - 如果是放在
.htaccess文件里,要确保你的Apache配置允许.htaccess生效(配置中需设置AllowOverride All) - 如果有多个城市,这些规则会自动匹配对应的城市名,不需要为每个城市单独写规则
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

