有一个站点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
,因此处理继续(并且重定向可能不会发生或格式不正确,具体取决于随后的指令)。