在Apache重写规则中将字符串重写为路径分隔符

在Apache重写规则中将字符串重写为路径分隔符,apache,mod-rewrite,url-rewriting,path-separator,Apache,Mod Rewrite,Url Rewriting,Path Separator,我正在与第三方网站合作,该网站通过名称而不是url来缓存wave文件。我的系统中有很多同名但不同目录的wave文件,但是第三方网站在请求同名但不同目录的文件时播放了错误的文件 因此,我考虑从url中删除斜杠(“/”),并将其与字符串\u dir\u separator\u组合,以使wave文件在整个系统中唯一 我如何重写url,以便所有出现的_dir_separator_内部重写为斜杠 例如,请求此文件http://mysite/media_dir_separator_voice_scripts

我正在与第三方网站合作,该网站通过名称而不是url来缓存wave文件。我的系统中有很多同名但不同目录的wave文件,但是第三方网站在请求同名但不同目录的文件时播放了错误的文件

因此,我考虑从url中删除斜杠(“/”),并将其与字符串\u dir\u separator\u组合,以使wave文件在整个系统中唯一

我如何重写url,以便所有出现的_dir_separator_内部重写为斜杠

例如,请求此文件
http://mysite/media_dir_separator_voice_scripts_dir_separator_script_en_v11.wav

应该选择这个
http://mysite/media/voice_scripts/script_en.wav

请注意,目录结构是多层次的,所以重写固定数量的模式将不起作用

编辑:我改变了主意,希望使用连字符(-)而不是_dir_separator_ustring。重要的是,我需要这个工作没有重写

   RewriteRule ^([^-]*)-([^-]*-.*) $1/$2 [N]
    RewriteRule ^([^-]*)-([^-]*)$ $1/$2 [L]

如果主机已启用mod rewrite,并设置了
AllowOverride
,使您能够设置htaccess文件,则可以使用以下功能:

RewriteEngine On

RewriteCond %{REQUEST_URI} _dir_separator_ [NC]
RewriteRule ^(.*)_dir_separator_(.+)$ /$1/$2 [R,L]
在我的系统上使用curl进行测试,可以得到:

$ curl -LI http://localhost/media_dir_separator_voice_scripts_dir_separator_script_en_v11.wav

HTTP/1.1 302 Found
Date: Sun, 11 Sep 2016 05:59:26 GMT
Server: Apache/2.4.18 (Win64) PHP/7.0.4
Location: http://localhost/media_dir_separator_voice_scripts/script_en_v11.wav
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sun, 11 Sep 2016 05:59:26 GMT
Server: Apache/2.4.18 (Win64) PHP/7.0.4
Location: http://localhost/media/voice_scripts/script_en_v11.wav
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 404 Not Found
Date: Sun, 11 Sep 2016 05:59:26 GMT
Server: Apache/2.4.18 (Win64) PHP/7.0.4
Content-Type: text/html; charset=iso-8859-1

对于连字符(
-
)的使用:

RewriteRule ^(.*)-(.+)$ /$1/$2 [N]

如果主机已启用mod rewrite,并设置了
AllowOverride
,使您能够设置htaccess文件,则可以使用以下功能:

RewriteEngine On

RewriteCond %{REQUEST_URI} _dir_separator_ [NC]
RewriteRule ^(.*)_dir_separator_(.+)$ /$1/$2 [R,L]
在我的系统上使用curl进行测试,可以得到:

$ curl -LI http://localhost/media_dir_separator_voice_scripts_dir_separator_script_en_v11.wav

HTTP/1.1 302 Found
Date: Sun, 11 Sep 2016 05:59:26 GMT
Server: Apache/2.4.18 (Win64) PHP/7.0.4
Location: http://localhost/media_dir_separator_voice_scripts/script_en_v11.wav
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sun, 11 Sep 2016 05:59:26 GMT
Server: Apache/2.4.18 (Win64) PHP/7.0.4
Location: http://localhost/media/voice_scripts/script_en_v11.wav
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 404 Not Found
Date: Sun, 11 Sep 2016 05:59:26 GMT
Server: Apache/2.4.18 (Win64) PHP/7.0.4
Content-Type: text/html; charset=iso-8859-1

对于连字符(
-
)的使用:

RewriteRule ^(.*)-(.+)$ /$1/$2 [N]

我改变了主意。我更喜欢用简单的破折号(-),而不是直接分开。我会确保所有文件中都没有破折号。我尝试了这个重写规则^([^-]*)-([^-]*-.*)$1/$2[N]重写规则^([^-]*)-([^-]*)$$1/$2[L],但它似乎不起作用。我需要重写解决方案在没有重定向的情况下工作。@SenG不要使用
L
标志。我在vhost文件中使用了您的确切代码片段,它仍然重定向。我可以在浏览器中看到新的URL。我们可以从这个答案得出解决方案吗@在我上面的代码示例中,将
[R,L]
替换为
[N]
我改变了主意。我更喜欢用简单的破折号(-),而不是直接分开。我会确保所有文件中都没有破折号。我尝试了这个重写规则^([^-]*)-([^-]*-.*)$1/$2[N]重写规则^([^-]*)-([^-]*)$$1/$2[L],但它似乎不起作用。我需要重写解决方案在没有重定向的情况下工作。@SenG不要使用
L
标志。我在vhost文件中使用了您的确切代码片段,它仍然重定向。我可以在浏览器中看到新的URL。我们可以从这个答案得出解决方案吗@在上面的代码示例中,将
[R,L]
替换为
[N]