mod_rewrite全部,如果没有找到

mod_rewrite全部,如果没有找到

我需要制定一些重写规则,但我已经多年不使用 Apache HTTP 并且对规则有点困惑......

任务:

  1. 将 URL 重写http://example.com/test/file.jshttp://example.com/test/1/file.js
  2. 如果http://example.com/test/1/file.js未找到文件 - 返回文件http://example.com/test/1/index.html

我想 - 它一定看起来像这样:

    <Location /test>
            AllowOverride All

            # if file http://example.com/test/1/file.js found - return it
            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f
            RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/test/1/$1 [L]

            # if file http://example.com/test/1/file.js NOT found - return index.html form /1/ subdir
            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/test/1/index.html [L]

    </Location>

内容/test/

# ls -l
total 16
drwxr-xr-x 2 root root 4096 Aug 20 10:14 1
-rw-r--r-- 1 root root    6 Aug 20 08:57 index.html
-rw-r--r-- 1 root root    3 Aug 20 10:06 jj.ll
-rw-r--r-- 1 root root   64 Aug 20 08:50 test.html

/test/1/

# ls -l 1
total 12
-rw-r--r-- 1 root root 15 Aug 20 11:02 file.js
-rw-r--r-- 1 root root 13 Aug 20 10:03 index.html
-rw-r--r-- 1 root root  7 Aug 20 10:14 jj.ll

但是 - 如果我尝试打开类似的 URL - 我无论如何http://example.com/test/file.js都会收到文件。http://example.com/test/1/index.html

答案1

可以这样解决:

            RewriteCond %{REQUEST_URI} !/test/1
            RewriteRule ^.*test(.*) https://%{HTTP_HOST}/test/1$1 [L]

            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f
            RewriteRule ^.*test(.*) %{DOCUMENT_ROOT}/test/1/$1 [L]

            RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
            RewriteRule ^.*test(.*) %{DOCUMENT_ROOT}/test/1/index.html [L]

看起来有效。

相关内容