regex - 使用正则表达式模式重写 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)
我做错了什么?
解决方案
我选择了这样的方法:
RewriteEngine on
RewriteRule ^/?([^/]+)/.+/([^/]+\.php)$ /$1/$2 [END]
您可能需要根据您的具体情况添加一些例外情况,但通常它应该做您想要的。
该规则同样适用于动态配置文件(“.htaccess”)和真实的 http 服务器主机配置。
和一个一般性评论:您应该始终更喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。
推荐阅读
- android - TextView 没有出现在模拟器和真实设备上
- excel - 如何在 VBA 代码中将名称范围用于新图表系列的值和 X 值?
- git - 添加第二个远程删除的文件
- django-templates - 编写测试时 Circle CI 的 Django 模板错误
- omnet++ - omnet ++ 程序,执行此消息时,模块中出现错误(cModule)
- pkcs#11 - PKCS11 将私有 RSA 密钥解包到 eToken HSM
- angular - 是否可以在角度 2 中读取其他应用程序的本地存储?
- laravel - 使用 Mix/Webpack 将 quill.js 导入 Laravel
- svn - 需要帮助使用 Cake 对 SVN 存储库进行身份验证
- sql - 使用文件时向表中插入数据时触发器无法捕获