首页 > 解决方案 > 使用正则表达式模式重写 URL

问题描述

我需要使用 .htaccess 重写 URL,以将所有用户从旧站点地图重定向到新 URL。旧 URL 如下所示:

http://server.linux.example.com/a/v/c/document_title1.php
http://server.linux.example.com/jp/x/1/o/document_title32.php
http://server.linux.example.com/kr/a/a/2/document_title12343.php
http://server.linux.example.com/cn/6/z/z/document_title124.php

我需要保留第一个目录,然后删除所有子目录,包括斜杠和字符(/ 之间的字母和数字),因此新的 URL 将如下所示:

http://server.linux.example.com/document_title1.php
http://server.linux.example.com/jp/document_title32.php
http://server.linux.example.com/kr/document_title12343.php
http://server.linux.example.com/cn/document_title124.php

到目前为止,这是我使用 stackoverflow.com 的帮助所做的。

(?<=http://server\.linux\.example\.com/)(jp/|kr/|cn/)?.*(?=\.php)

regex101.com 表明这是一个有效的正则表达式,但我在 .htaccess 中实现它时遇到了问题,因为我收到了 500 个错误。

ReWriteRule (?<=http://server\.linux\.example\.com/)(jp/|kr/|cn/)?.*(?=\.php)

我做错了什么?

标签: regexapache.htaccessmod-rewriteurl-rewriting

解决方案


我选择了这样的方法:

RewriteEngine on 
RewriteRule ^/?([^/]+)/.+/([^/]+\.php)$ /$1/$2 [END]

您可能需要根据您的具体情况添加一些例外情况,但通常它应该做您想要的。

该规则同样适用于动态配置文件(“.htaccess”)和真实的 http 服务器主机配置。

和一个一般性评论:您应该始终更喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。


推荐阅读