htaccess - Redirect to subfolder without changing browser URL

那年仲夏 提交于 2021-02-07 07:55:06

问题


I've a domain that contains a subfolder with the web app structure. I added a .htaccess on my root domain to point the public folder on my subfolder web app. It works fine, but when I type www.example.com the browser URL changes to www.example.com/subfolder/public, but I would like that it doesn't change.

This is my .htaccess:

RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]

EDIT

This first .htaccess is used to redirect on subfolder/public, where there is an other .htaccess that makes all the works.

Here the code of the second .htaccess located on 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]

回答1:


Sorry, just realised what is happening. It has nothing to do with the second .htaccess file in the subdirectory, as mentioned in comments.

RewriteRule ^.*$ subfolder/public [NC,L]

Since public is a physical directory on the file system, you need to include a trailing slash when internally rewriting to that directory. Otherwise, mod_dir is going to try to "fix" the URL by appending a slash - that is where the external redirect is coming from. (mod_dir implicitly triggers an external redirect from subfolder/public to subfolder/public/.)

So, try the following instead in your root .htaccess file:

RewriteRule .* subfolder/public/ [L]

The important thing is the trailing slash. The anchors (^ and $) on the RewriteRule pattern are not required, since you are matching everything. And the NC flag is also not required for the same reason.

As always, make sure the browser cache is clear before testing.


UPDATE#1: The single directive above rewrites everything, including static resources, to the directory subfolder/public/ which then relies on the second .htaccess file in the subdirectory to correctly route the request. In order to allow static resources to be rewritten correctly (represented in the HTML as root-relative URL-paths, of the form "/js/myjs.js") then you will need additional directives in order to rewrite these.

For example, to specifically rewrite all .js and .css files to the real location in /subfolder/public/...

# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

UPDATE#2: To make the above more general, and to rewrite any static resource (images, PDFs, .txt, etc...) we can check for the existence of the file before rewriting, something like:

# 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]

This will mean that if any .css does not exist it will be passed through to subfolder/public/.



来源:https://stackoverflow.com/questions/41488099/htaccess-redirect-to-subfolder-without-changing-browser-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!