设置自定义 DocumentRoot 时,将子文件夹中所有存在和不存在的页面和文件夹重定向到一页

Aci*_*don 2 apache .htaccess mod-rewrite url-rewriting document-root

我有下一个文件结构:

\n
.htaccess\nindex.php\npublic/\n\xe2\x94\x9c\xe2\x94\x80 v1/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 .htaccess\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 index.php\n\xe2\x94\x9c\xe2\x94\x80 index.php\n
Run Code Online (Sandbox Code Playgroud)\n

我已将服务器级别的文档根设置为public子文件夹,以便将其从 url 中删除。

\n

我需要将 url 中包含的所有请求v1重定向到v1/index.php.

\n

我的根.htaccess:

\n
RewriteEngine On\nRewriteCond %{REQUEST_URI} !public/\nRewriteRule (.*) /public/$1 [L]\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule ^([^\\.]+)$ $1.php [NC,L]\n
Run Code Online (Sandbox Code Playgroud)\n

和v1/.htaccess:

\n
RewriteCond %{REQUEST_FILENAME} !-f [OR]\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteCond %{REQUEST_FILENAME} !-d  [OR]\nRewriteCond %{REQUEST_FILENAME} -d\nRewriteRule ^ index.php [QSA,L]\n
Run Code Online (Sandbox Code Playgroud)\n

预期行为:

\n

不存在的https://example.com/v1/test页面应重定向到https://example.com/v1/.

\n

我得到的是:

\n
Not Found\nThe requested URL was not found on this server.\n\nAdditionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.\n
Run Code Online (Sandbox Code Playgroud)\n

我很确定问题出在第二个.htaccess。我还怀疑自定义文档根在这里也可能是一个问题。

\n

Rav*_*h13 5

尝试按以下方式获取您的根 .htaccess 一次,然后尝试一下并删除您的内部 .htaccess(尽管在本地系统中保留它的备份,但系统上没有它)。在测试 URL 之前清除浏览器缓存。

RewriteEngine ON

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} !\s/public(?:/\S*)*\s [NC]
RewriteCond %{THE_REQUEST} !\s/v1(?:/\S*)*\s [NC]
RewriteRule ^(.*)/?$ /public/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} !\s/v1(?:/\S*)*\s [NC]
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteCond %{THE_REQUEST} !\s/v1/?\s [NC]
RewriteRule ^(v1)/.+/?$ /$1/? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^v1/?$  public/v1/index.php [QSA,L]
Run Code Online (Sandbox Code Playgroud)

注意:将在早上添加详细的解释,因为对我来说太晚了。