具有任何嵌套的 url 的 htaccess RewriteRule 正则表达式

具有任何嵌套的 url 的 htaccess RewriteRule 正则表达式

有一个站点example.com/aaaa/bbbb/cccc/.../zzzz,其中/aaaa/bbbb/cccc/.../zzzz是一条带有任意嵌套的路径。

如果 URL 包含以点开头的文件或目录(隐藏文件或目录)且该文件/目录存在,则执行 301 重定向到example.com/1

如果文件不存在则重定向到example.com/2

至少提示此类 URL 的正则表达式。

RewriteEngine On
RewriteBase /

RewriteRule ^([^/]/\.[^/]/) forbidden [R=301]

我尝试想出一个正则表达式,如果 URL 包含隐藏文件/目录,则重定向将通过。但它没有奏效。

答案1

您可以在根文件顶部附近使用 mod_rewrite 执行此操作.htaccess。例如:

RewriteEngine On

# Skip the next 2 rules if the requested URL does "not" match
# ie. A dot/hidden file or directory has "NOT" been requested
RewriteRule !(^|/)\.[^/]+ - [S=2]

# If the request for a hidden file/dir exists then redirect to "/1"
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ /1 [R=301,L]

# If the request for a hidden file/dir does "NOT" exist then redirect to "/2"
RewriteRule ^ /2 [R=301,L]

正则表达式(^|/)\.[^/]+匹配任意 URL 路径,其中任何路径段以点开头(用于捕捉请求“隐藏”目录中的文件的情况)。


RewriteRule ^([^/]/\.[^/]/) forbidden [R=301]

此处使用的正则表达式仅匹配以下形式的 URL /<single-character/.<single-character>/<anything>- 其中“隐藏”文件/目录仅存在于第二个路径段中,且长度仅为 1 个字符。它也不会检查该文件/目录是否存在。并且规则缺少标志L,因此处理继续(并且重定向可能不会发生或格式不正确,具体取决于随后的指令)。

相关内容