skip to Main Content

I am unable to write a rule that matches double slashes.

In my .htacess file:

#RULE 1:  
RewriteCond %{REQUEST_URI} ^.*hi1.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

#RULE 2: 
RewriteCond %{REQUEST_URI} ^.*hi2/.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

#RULE 3: 
RewriteCond %{REQUEST_URI} ^.*hi3//.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

RESULTS:

https://www.example.com/hi1//  
successfully redirects to google  

https://www.example.com/hi2//
successfully redirects to google  

https://www.example.com/hi3//
fails to redirect to google

Third url yields the following:
Sorry, this page doesn’t exist.
Please check the URL or go back a page.
404 Error. Page Not Found.

EDIT # 1:

Interestingly:

#RULE 4: 
RewriteCond %{REQUEST_URI} ^.*hi4/.*/.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

RESULTS:

https://www.example.com/hi4/abc/  
successfully redirects to google 

https://www.example.com/hi4//
fails to redirect to google

EDIT # 2:

My original post seems to have created confusion. I will try to be clearer: I need a rule that will match a url ending in double slash, and will not match a url that does not end in double slash. Currently, my .htaccess file contains only the following:

RewriteEngine on

RewriteRule yoyo https://www.cnn.com/ [R=301,L]  

RewriteCond %{THE_REQUEST} //$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L]  

Results:

https://www.example.com/about-us//
fails to redirect to google, and yields 404 error

(The first rule (yoyo) is only to ensure no caching.)

EDIT # 3:

I see that the confusion continues. So, my .htaccess file contains only:

RewriteEngine on
RewriteCond %{THE_REQUEST} //$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L]  

Results:

https://www.example.com/about-us//
fails to redirect to google, and yields 404 error

This time, I think we can rule out caching, because I used the .htaccss on a website of mine that previously had no .htaccess file.

Simply, my efforts to match a url ending with double-slash are failing.

4

Answers


  1. Chosen as BEST ANSWER

    Here's what finally worked to match double slashes (nothing else worked for me):

    RewriteEngine on
    RewriteCond %{THE_REQUEST} //
    RewriteRule ^.*$ https://www.google.com/ [R=301,L]
    

    (And, as I wrote, I was careful to prevent caching, so caching never was an issue.)

    PLOT TWIST:

    Even this solution, which is the only solution that works on one of my websites, does not work on the website I have been testing on for most of this discussion. In other words, there is not one single solution for matching double-slash on that server!


  2. You need not to write 3 rules when you could catch similar kind of URIs with regex patterns so that we need not to write multiple patterns, this also takes cares of multiple occurrences of / coming in the end. Could you please try following, please make sure you clear your browser cache after placing these rules into your htaccess file.

    RewriteEngine ON
    RewriteCond %{REQUEST_URI} ^/hi[0-9]+/{2,}?$ [NC] 
    RewriteRule ^(.*)$ https://www.google.com/ [R=301,L] 
    
    Login or Signup to reply.
  3. EDIT:
    OK now I get it. Only match paths ending with two slashes.

    I updated the answer. The request URI inside THE_REQUEST is not on the end, but is followed by a space and more after that, so matching //s should work for you

    AmitVerma mentioned the correct answer in his comment, but it is being snowed in by other comments. For all the other people like me who did not know about the THE_REQUEST parameter (thank you Amit) a more complete answer here.

    The problem with the original rule is the use of the REQUEST_URI parameter. The value of this parameter will probably already have been cleaned by the webserver or other modules. Double slashes would have been removed.

    The THE_REQUEST parameter contains the original unmodified request. Therefore the following will work as requested:

    RewriteCond %{THE_REQUEST} //s.*$
    RewriteRule ^.*$ https://www.google.com/ [R=301,L] 
    
    Login or Signup to reply.
  4. Regarding your updated question:

    … I need a rule that will match a url ending in double slash

    RewriteCond %{THE_REQUEST} //$ 
    RewriteRule ^.*$ https://www.google.com/ [R=301,L]
    

    Aside: Your previous rules matched a URL containing a double slash anywhere in the URL-path (which would naturally catch a double slash at the end as well).

    However, the above will not match a URL that ends with a double slash. In fact, it will never match anything because THE_REQUEST does not only contain the URL. THE_REQUEST server variable contains the first line of the HTTP request headers. For example, when you request https://example.com/about-us//, THE_REQUEST will contain a string of the form:

    GET /about-us// HTTP/1.1
    

    So, you can see from the above that a regex like //$ will never match. You will need to use a condition of the form:

    RewriteCond %{THE_REQUEST} //s
    

    To match two slashes followed by a space. Which could only occur at the end of URL. (Although it could also occur at the end of the query string, but cross that bridge when we come to it.)

    However, since the other suggestions (eg. ^.*hi3//.*$) don’t appear to have worked, then this is not going to work either.

    You need to clear your browser cache before testing and please test with 302 (temporary) redirects, otherwise, you can easily go round in circles chasing caching issues. You should also test this with the Browser "Inspector" open on the "Network" tab and check the "Disable cache" option. For example, in Chrome:

    Disable Cache in Chrome Inspector

    (UPDATE) Debugging…

    This does not seem to be a question about regex, as the earlier answers/comments (and code snippets in the question itself) should already have produced the desired results. So "something else" would seem to be going on here.

    To debug and see the value of THE_REQUEST, you can do something like the following (at the very top of your .htaccess file):

    RewriteCond %{QUERY_STRING} !^the-request=
    RewriteRule ^ /?the-request=%{THE_REQUEST} [R,L]
    

    And then request /about-us//. You should then be redirected to a URL of the form:

    /?the-request=GET%20/about-us//%20HTTP/1.1
    

    (Where the %20 are naturally the URL encoded spaces.)

    Please report back exactly what you are seeing.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search