Ale*_*ani 4 apache .htaccess mod-rewrite redirect url-rewriting
我有一个域,其中包含一个带有 Web 应用程序结构的子文件夹。我.htaccess
在我的根域上添加了一个指向我的子文件夹 Web 应用程序上的公共文件夹。它工作正常,但是当我键入www.example.com
浏览器 URL 时www.example.com/subfolder/public
,它会更改为,但我希望它不会更改。
这是我的.htaccess
:
RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]
Run Code Online (Sandbox Code Playgroud)
第一个 .htaccess 用于重定向子文件夹/公共,其中还有一个其他 .htaccess 可以完成所有工作。
这里的第二个 .htaccess 的代码位于www.example.com/subfolder/public/
:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Run Code Online (Sandbox Code Playgroud)
抱歉,刚刚意识到发生了什么。.htaccess
如评论中所述,它与子目录中的第二个文件无关。
Run Code Online (Sandbox Code Playgroud)RewriteRule ^.*$ subfolder/public [NC,L]
由于public
是文件系统上的物理目录,因此在内部重写该目录时需要包含尾部斜杠。否则, mod_dir 将尝试通过附加斜杠来“修复” URL - 这就是外部重定向的来源。(mod_dir 隐式地触发了从subfolder/public
to的外部重定向subfolder/public/
。)
因此,请在您的根.htaccess
文件中尝试以下操作:
RewriteRule .* subfolder/public/ [L]
Run Code Online (Sandbox Code Playgroud)
重要的是尾部斜杠。锚(^
和$
上)RewriteRule
的图案不是必需的,因为你是匹配的一切。而且NC
也不需要为同一个原因标志。
与往常一样,请确保在测试前清除浏览器缓存。
更新#1:上面的单个指令将所有内容(包括静态资源)重写到目录中 subfolder/public/
,然后该目录依赖.htaccess
子目录中的第二个文件来正确路由请求。为了允许正确重写静态资源(在 HTML 中表示为根相对 URL 路径,形式为"/js/myjs.js"
),那么您将需要额外的指令来重写这些。
例如,专门将所有.js
和.css
文件重写到实际位置/subfolder/public/...
# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]
# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]
Run Code Online (Sandbox Code Playgroud)
更新#2:为了使上述更通用,并重写任何静态资源(图像、PDF、.txt 等),我们可以在重写之前检查文件是否存在,例如:
# Rewrite static resources
RewriteCond %{DOCUMENT_ROOT}/subfolder/public/$1 -f
RewriteRule (.+) subfolder/public/$1 [L]
# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]
Run Code Online (Sandbox Code Playgroud)
这意味着如果任何.css
不存在,它将被传递到subfolder/public/
.
归档时间: |
|
查看次数: |
16935 次 |
最近记录: |