简体   繁体   中英

.htaccess RewriteRule with existing file and folder

My web structure looks like this:

public_html/
    /images/
        /user/
             /userimage1.jpg
             /userimage2.jpg
             /userimage3.jpg
        /icons/
    /index.php
    /user.php
...

I have 2 domains: example.com and images.example.com and I want to use a .htaccess RewriteRule that the images.example.com subdomain leads to the /images/ -folder but also to use URLs without the file extension.

My .htaccess looks like this:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks +MultiViews
    RewriteEngine on

    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    RewriteCond %{HTTP_HOST} ^images\.example\.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/images/
    RewriteRule ^(.*)$ /images/$1 [NC,L]

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f
    RewriteRule ^(.*)$ $1.php [L]
</IfModule>

Now, https://example.com/user/ works fine, but when I try to open https://images.example.com/user/userimage1.jpg it says that %{REQUEST_URI} is /images/redirect:/images/user.php/userimage1.jpg

Unfortunately, both, the domain and the subdomain have to be installed with public_html as the root folder.

How do I have to adept my .htaccess file so that both URLs, https://example.com/user/ and https://images.example.com/user/userimage1.jpg work fine?

You have a conflict with MultiViews (which you've enabled at the top). The fact that " https://example.com/user/ works fine" (with a trailing slash) is because of MultiViews, not because of your mod_rewrite directives. (The mod_rewrite directives as written would only "work" with /user - no trailing slash.)

When you request https://images.example.com/user/userimage1.jpg , MultiViews triggers an internal subrequest for /user.php/userimage1.jpg ( /user.php with additional path-info /userimage1.jpg ), but mod_rewrite has also tried to rewrite the request (an internal "redirect") - hence the seemingly malformed rewrite.

Generally, you need to avoid using MultiViews with mod_rewrite rewrites - a common cause of conflict.

Try the following instead:

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Rewrite images subdomain
RewriteCond %{HTTP_HOST} ^images\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/images/
RewriteRule ^(.*)$ /images/$1 [L]

# Append .php file extensions
RewriteCond %{DOCUMENT_ROOT}/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)/$ $1.php [L]

Note that I've included the trailing slash in the RewriteRule pattern and taken this out of the capturing subpattern - this is assuming that the trailing slash is mandatory on your URLs (as in your example).

You don't need the <IfModule> wrapper unless mod_rewrite really is optional? (It's not.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM