Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用URL重写从URL重定向中删除文件夹_Regex_Url_Iis_Rewrite - Fatal编程技术网

Regex 使用URL重写从URL重定向中删除文件夹

Regex 使用URL重写从URL重定向中删除文件夹,regex,url,iis,rewrite,Regex,Url,Iis,Rewrite,考虑以下结构: /folderx/a.aspx /folderx/b.aspx /foldery/c.aspx /folderz/d.aspx 当前,浏览器显示以下URL https://xxx.domain.yyy/folderx/a.aspx https://xxx.domain.yyy/folderx/b.aspx https://xxx.domain.yyy/foldery/c.aspx https://xxx.domain.yyy/folderz/d.aspx 我们如何将重定向到浏

考虑以下结构:

/folderx/a.aspx
/folderx/b.aspx
/foldery/c.aspx
/folderz/d.aspx
当前,浏览器显示以下URL

https://xxx.domain.yyy/folderx/a.aspx
https://xxx.domain.yyy/folderx/b.aspx
https://xxx.domain.yyy/foldery/c.aspx
https://xxx.domain.yyy/folderz/d.aspx
我们如何将重定向到浏览器中的地址栏中显示以下URL?»

https://xxx.domain.yyy/a
https://xxx.domain.yyy/b
https://xxx.domain.yyy/c
https://xxx.domain.yyy/d
条件:

  • URL匹配中没有对
    folderx
    foldery
    folderz
    等进行硬编码

几天来一直在尝试获取此信息,但无法获得满足上述要求的工作规则集。
有人能帮忙吗?

如果不硬编码可能的文件夹名称,这是不可能的。mod_rewrite如何神奇地知道哪些文件夹是可能的?它必须是硬编码的。这违反了你的条件,但这是唯一的办法

它可以尝试每一个,因此它不必知道哪些文件夹与哪些aspx文件匹配,但它必须知道哪些文件夹是可能的。如果您知道哪些文件夹是可能的(例如,“folderx”、“foldery”和“folderz”),您可以对每个可能的文件夹进行一系列重写,如下所示:

RewriteCond /folderx%{REQUEST_FILENAME}.aspx -f
RewriteRule ^(.+)$ /folderx/$1.aspx [L,QSA]

RewriteCond /foldery%{REQUEST_FILENAME}.aspx -f
RewriteRule ^(.+)$ /foldery/$1.aspx [L,QSA]

RewriteCond /folderz%{REQUEST_FILENAME}.aspx -f
RewriteRule ^(.+)$ /folderz/$1.aspx [L,QSA]

这些规则说“如果定义的文件夹中存在具有aspx扩展名的文件,请将其重写。”

如果不硬编码可能的文件夹名称,这是不可能的。mod_rewrite如何神奇地知道哪些文件夹是可能的?它必须是硬编码的。这违反了你的条件,但这是唯一的办法

它可以尝试每一个,因此它不必知道哪些文件夹与哪些aspx文件匹配,但它必须知道哪些文件夹是可能的。如果您知道哪些文件夹是可能的(例如,“folderx”、“foldery”和“folderz”),您可以对每个可能的文件夹进行一系列重写,如下所示:

RewriteCond /folderx%{REQUEST_FILENAME}.aspx -f
RewriteRule ^(.+)$ /folderx/$1.aspx [L,QSA]

RewriteCond /foldery%{REQUEST_FILENAME}.aspx -f
RewriteRule ^(.+)$ /foldery/$1.aspx [L,QSA]

RewriteCond /folderz%{REQUEST_FILENAME}.aspx -f
RewriteRule ^(.+)$ /folderz/$1.aspx [L,QSA]
这些规则表示“如果定义的文件夹中存在具有aspx扩展名的文件,请重写到该文件”

第一条规则将使用原始请求中的路径信息请求
domain/directory/file.aspx
domain/file
dir

RewriteCond %{HTTP_COOKIE} (?:^|;\s*)dir=([^;]+)
RewriteRule ^/?(.*)$ /%1/$1.aspx [QSA,L]
第二条规则将
dir
并根据原始请求的路径为请求提供服务。这将导致通过正确的路由从url中删除目录

第一条规则将使用原始请求中的路径信息请求
domain/directory/file.aspx
domain/file
dir

RewriteCond %{HTTP_COOKIE} (?:^|;\s*)dir=([^;]+)
RewriteRule ^/?(.*)$ /%1/$1.aspx [QSA,L]

第二条规则将
dir
并根据原始请求的路径为请求提供服务。这将导致通过正确的路由从url中删除目录…

原始请求中包含文件夹/目录。我相信OP希望这样的请求被重定向到url,而不在url中列出文件夹/目录,但是保持从原始请求到文件夹/目录的正确路由@Ω可能是mega,但我没有解释为字面重定向。我将其解释为,第二个表单应该能够重写到第一个表单,而不必实际转到第一个表单并被重定向——这会使您的cookie解决方案无法真正工作(如果他们从不访问原始url,则cookie永远不会设置)。但也许我解释错了@Ωmega,尽管如此,我在你的答案上给了你一个+1,因为如果OP同意要求用户先访问原始表单并重定向,你的解决方案就会起作用。我相信OP希望将长url更改为短url,输入长url。我想他/她担心的是浏览器会在地址栏中显示短url。所以浏览器得到的实际url是长的@Ωmega——正如我所说,我的解释是不同的(即短URL可以直接访问)。但我理解您的解释,并同意如果是这样,您的解决方案将起作用。原始请求中包含Folder/directory。我相信OP希望这样的请求被重定向到url,而不在url中列出文件夹/目录,但是保持从原始请求到文件夹/目录的正确路由@Ω可能是mega,但我没有解释为字面重定向。我将其解释为,第二个表单应该能够重写到第一个表单,而不必实际转到第一个表单并被重定向——这会使您的cookie解决方案无法真正工作(如果他们从不访问原始url,则cookie永远不会设置)。但也许我解释错了@Ωmega,尽管如此,我在你的答案上给了你一个+1,因为如果OP同意要求用户先访问原始表单并重定向,你的解决方案就会起作用。我相信OP希望将长url更改为短url,输入长url。我想他/她担心的是浏览器会在地址栏中显示短url。所以浏览器得到的实际url是长的@Ωmega——正如我所说,我的解释是不同的(即短URL可以直接访问)。但我理解你的解释,并同意如果是这样的话,你的解决方案会起作用。