htaccess Silent Redirect to Subdirectory: Subdirectory showing when no trailing '/'

后端 未结 2 2045
借酒劲吻你
借酒劲吻你 2021-02-10 08:45

I have dug high and low around Google and StackOverflow to try and figure out my problem, trying countless solutions but nothing has completely worked.

I\'m looking to m

2条回答
  •  星月不相逢
    2021-02-10 09:04

    This is probably happening because mod_dir (the module that automatically redirects the browser if a request for a directory is missing a trailing slash to the same thing with a trailing slash. See the DirectorySlash directive in mod_dir

    What's happening is:

    1. You request: mydomain.com/Contact
    2. mod_dir doesn't touch this since /Contact isn't a directory
    3. /Contact gets rewritten to /subdir/Contact and internally redirected
    4. mod_dir sees that /subdir/Contact is a directory and missing the trailing slash so it redirects the browser to mydomain.com/subdir/Contact/
    5. So now, your browser's location bar has the /subdir/ in it.

    You can add DirectorySlash off in your .htaccess to turn off mod_dir from redirecting. But if you want directories to have trailing slashes, you can add a separate condition for it. Based on what you already have, we can expand it to this:

    RewriteEngine on
    
    # Has a trailing slash, don't append one when rewriting
    RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$
    RewriteCond %{REQUEST_URI} !^/subdir/
    RewriteCond %{THE_REQUEST} ./\ HTTP/1\.[01]$ [OR]
    # OR if it's a file that ends with one of these extensions
    RewriteCond %{REQUEST_URI} \.(php|html?|jpg|gif|css)$
    RewriteRule ^(.*)$ /subdir/$1 [L]
    
    # Missing trailing slash, append one
    RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$
    RewriteCond %{REQUEST_URI} !^/subdir/
    RewriteCond %{THE_REQUEST} [^/]\ HTTP/1\.[01]$
    # But only if it's not a file that ends with one of these extensions
    RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif|css)$
    RewriteRule ^(.*)$ /subdir/$1/ [L]
    

    Note: I changed !^/mydomain/ to !^/subdir/, figured it was a typo because without it, mod_rewrite would loop internally indefinitely (foo -> /subdir/foo -> /subdir/subdir/foo -> /subdir/subdir/subdir/foo, etc). If I got that wrong, you can change it back.

    Edit: See my additions of RewriteCond's matching against \.(php|html?|jpg|gif|css). These are the file extensions that get passed through without getting trailing slashes added. You can add/remove to suit your needs.

提交回复
热议问题