Модуль Apache mod_rewrite


Оглавление (нажмите, чтобы открыть):

Module mod_rewrite
URL Rewriting Engine

This module provides a rule-based rewriting engine to rewrite requested URLs on the fly.

Summary

«The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downs > — Brian Behlendorf
Apache Group

« Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. »

This module uses a rule-based rewriting engine (based on a regular-expression parser) to rewrite requested URLs on the fly. It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule to provide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on various tests, for instance server variables, environment variables, HTTP headers, time stamps and even external database lookups in various formats can be used to achieve a really granular URL matching.

This module operates on the full URLs (including the path-info part) both in per-server context ( httpd.conf ) and per-directory context ( .htaccess ) and can even generate query-string parts on result. The rewritten result can lead to internal sub-processing, external request redirection or even to an internal proxy throughput.

But all this functionality and flexibility has its drawback: complexity. So don’t expect to understand this entire module in just one day.

This module was invented and originally written in April 1996
and gifted exclusively to the The Apache Group in July 1997 by

Table Of Contents

Internal Processing

Configuration Directives

Internal Processing

The internal processing of this module is very complex but needs to be explained once even to the average user to avoid common mistakes and to let you exploit its full functionality.

API Phases

First you have to understand that when Apache processes a HTTP request it does this in phases. A hook for each of these phases is provided by the Apache API. Mod_rewrite uses two of these hooks: the URL-to-filename translation hook which is used after the HTTP request has been read but before any authorization starts and the Fixup hook which is triggered after the authorization phases and after the per-directory config files ( .htaccess ) have been read, but before the content handler is activated.

So, after a request comes in and Apache has determined the corresponding server (or virtual server) the rewriting engine starts processing of all mod_rewrite directives from the per-server configuration in the URL-to-filename phase. A few steps later when the final data directories are found, the per-directory configuration directives of mod_rewrite are triggered in the Fixup phase. In both situations mod_rewrite rewrites URLs either to new URLs or to filenames, although there is no obvious distinction between them. This is a usage of the API which was not intended to be this way when the API was designed, but as of Apache 1.x this is the only way mod_rewrite can operate. To make this point more clear remember the following two points:

  1. Although mod_rewrite rewrites URLs to URLs, URLs to filenames and even filenames to filenames, the API currently provides only a URL-to-filename hook. In Apache 2.0 the two missing hooks will be added to make the processing more clear. But this point has no drawbacks for the user, it is just a fact which should be remembered: Apache does more in the URL-to-filename hook than the API intends for it.
  2. Unbelievably mod_rewrite provides URL manipulations in per-directory context, i.e., within .htaccess files, although these are reached a very long time after the URLs have been translated to filenames. It has to be this way because .htaccess files live in the filesystem, so processing has already reached this stage. In other words: According to the API phases at this time it is too late for any URL manipulations. To overcome this chicken and egg problem mod_rewrite uses a trick: When you manipulate a URL/filename in per-directory context mod_rewrite first rewrites the filename back to its corresponding URL (which is usually impossible, but see the RewriteBase directive below for the trick to achieve this) and then initiates a new internal sub-request with the new URL. This restarts processing of the API phases.

Again mod_rewrite tries hard to make this complicated step totally transparent to the user, but you should remember here: While URL manipulations in per-server context are really fast and efficient, per-directory rewrites are slow and inefficient due to this chicken and egg problem. But on the other hand this is the only way mod_rewrite can provide (locally restricted) URL manipulations to the average user.

Don’t forget these two points!

Ruleset Processing

The order of rules in the ruleset is important because the rewriting engine processes them in a special (and not very obvious) order. The rule is this: The rewriting engine loops through the ruleset rule by rule ( RewriteRule directives) and when a particular rule matches it optionally loops through existing corresponding conditions ( RewriteCond directives). For historical reasons the conditions are given first, and so the control flow is a little bit long-winded. See Figure 1 for more details.

Figure 1: The control flow through the rewriting ruleset

As you can see, first the URL is matched against the Pattern of each rule. When it fails mod_rewrite immediately stops processing this rule and continues with the next rule. If the Pattern matches, mod_rewrite looks for corresponding rule conditions. If none are present, it just substitutes the URL with a new value which is constructed from the string Substitution and goes on with its rule-looping. But if conditions exist, it starts an inner loop for processing them in the order that they are listed. For conditions the logic is different: we don’t match a pattern against the current URL. Instead we first create a string TestString by expanding variables, back-references, map lookups, etc. and then we try to match CondPattern against it. If the pattern doesn’t match, the complete set of conditions and the corresponding rule fails. If the pattern matches, then the next condition is processed until no more conditions are available. If all conditions match, processing is continued with the substitution of the URL with Substitution.

Quoting Special Characters

As of Apache 1.3.20, special characters in TestString and Substitution strings can be escaped (that is, treated as normal characters without their usual special meaning) by prefixing them with a slosh (‘\’) character. In other words, you can include an actual dollar-sign character in a Substitution string by using ‘ \$ ‘; this keeps mod_rewrite from trying to treat it as a backreference.


Regex Back-Reference Availability

Figure 2: The back-reference flow through a rule

We know this was a crash course on mod_rewrite’s internal processing. But you will benefit from this knowledge when reading the following documentation of the available directives.

Configuration Directives

RewriteEngine

The RewriteEngine directive enables or disables the runtime rewriting engine. If it is set to off this module does no runtime processing at all. It does not even update the SCRIPT_URx environment variables.

Use this directive to disable the module instead of commenting out all the RewriteRule directives!

Note that, by default, rewrite configurations are not inherited. This means that you need to have a RewriteEngine on directive for each virtual host in which you wish to use it.

RewriteOptions

The RewriteOptions directive sets some special options for the current per-server or per-directory configuration. The Option strings can be one of the following:

inherit This forces the current configuration to inherit the configuration of the parent. In per-virtual-server context this means that the maps, conditions and rules of the main server are inherited. In per-directory context this means that conditions and rules of the parent directory’s .htaccess configuration are inherited. MaxRedirects= number In order to prevent endless loops of internal redirects issued by per-directory RewriteRule s, mod_rewrite aborts the request after reaching a maximum number of such redirects and responds with an 500 Internal Server Error. If you really need more internal redirects than 10 per request, you may increase the default to the desired value.

RewriteLog

The RewriteLog directive sets the name of the file to which the server logs any rewriting actions it performs. If the name does not begin with a slash (‘ / ‘) then it is assumed to be relative to the Server Root. The directive should occur only once per server config.

Note: To disable the logging of rewriting actions it is not recommended to set file-path to /dev/null , because although the rewriting engine does not then output to a logfile it still creates the logfile output internally. This will slow down the server with no advantage to the administrator! To disable logging either remove or comment out the RewriteLog directive or use RewriteLogLevel 0 !
Security: See the Apache Security Tips document for details on why your security could be compromised if the directory where logfiles are stored is writable by anyone other than the user that starts the server.

Example:

RewriteLogLevel

The RewriteLogLevel directive sets the verbosity level of the rewriting logfile. The default level 0 means no logging, while 9 or more means that practically all actions are logged.

To disable the logging of rewriting actions simply set Level to 0. This disables all rewrite action logs.

Notice: Using a high value for Level will slow down your Apache server dramatically! Use the rewriting logfile at a Level greater than 2 only for debugging!

Example:

RewriteLock

This directive sets the filename for a synchronization lockfile which mod_rewrite needs to communicate with RewriteMap programs. Set this lockfile to a local path (not on a NFS-mounted device) when you want to use a rewriting map-program. It is not required for other types of rewriting maps.

RewriteMap

The RewriteMap directive defines a Rewriting Map which can be used inside rule substitution strings by the mapping-functions to insert/substitute fields through a key lookup. The source of this lookup can be of various types.

The MapName is the name of the map and will be used to specify a mapping-function for the substitution strings of a rewriting rule via one of the following constructs:

The following combinations for MapType and MapSource can be used:


    Standard Plain Text
    MapType: txt , MapSource: Unix filesystem path to valid regular file

This is the standard rewriting map feature where the MapSource is a plain ASCII file containing either blank lines, comment lines (starting with a ‘#’ character) or pairs like the following — one per line.

Randomized Plain Text
MapType: rnd , MapSource: Unix filesystem path to valid regular file

This is identical to the Standard Plain Text variant above but with a special post-processing feature: After looking up a value it is parsed according to contained « | » characters which have the meaning of «or». In other words they indicate a set of alternatives from which the actual returned value is chosen randomly. Although this sounds crazy and useless, it was actually designed for load balancing in a reverse proxy situation where the looked up values are server names. Example:

Hash File
MapType: dbm , MapSource: Unix filesystem path to valid regular file

Here the source is a binary NDBM format file containing the same contents as a Plain Text format file, but in a special representation which is optimized for really fast lookups. You can create such a file with any NDBM tool or with the following Perl script:

Internal Function
MapType: int , MapSource: Internal Apache function

Here the source is an internal Apache function. Currently you cannot create your own, but the following functions already exists:

  • toupper:
    Converts the looked up key to all upper case.
  • tolower:
    Converts the looked up key to all lower case.
  • escape:
    Translates special characters in the looked up key to hex-encodings.
  • unescape:
    Translates hex-encodings in the looked up key back to special characters.
  • External Rewriting Program
    MapType: prg , MapSource: Unix filesystem path to valid regular file

    Here the source is a program, not a map file. To create it you can use the language of your choice, but the result has to be a executable (i.e., either object-code or a script with the magic cookie trick ‘ #!/path/to/interpreter ‘ as the first line).

    This program is started once at startup of the Apache servers and then communicates with the rewriting engine over its stdin and stdout file-handles. For each map-function lookup it will receive the key to lookup as a newline-terminated string on stdin . It then has to give back the looked-up value as a newline-terminated string on stdout or the four-character string « NULL » if it fails (i.e., there is no corresponding value for the given key). A trivial program which will implement a 1:1 map (i.e., key == value) could be:

    But be very careful:

    1. «Keep it simple, stupid» (KISS), because if this program hangs it will hang the Apache server when the rule occurs.
    2. Avoid one common mistake: never do buffered I/O on stdout ! This will cause a deadloop! Hence the « $|=1 » in the above example.
    3. Use the RewriteLock directive to define a lockfile mod_rewrite can use to synchronize the communication to the program. By default no such synchronization takes place.
  • The RewriteMap directive can occur more than once. For each mapping-function use one RewriteMap directive to declare its rewriting mapfile. While you cannot declare a map in per-directory context it is of course possible to use this map in per-directory context.

    Note: For plain text and DBM format files the looked-up keys are cached in-core until the mtime of the mapfile changes or the server does a restart. This way you can have map-functions in rules which are used for every request. This is no problem, because the external lookup only happens once!

    RewriteBase

    The RewriteBase directive explicitly sets the base URL for per-directory rewrites. As you will see below, RewriteRule can be used in per-directory config files ( .htaccess ). There it will act locally, i.e., the local directory prefix is stripped at this stage of processing and your rewriting rules act only on the remainder. At the end it is automatically added back to the path.

    When a substitution occurs for a new URL, this module has to re-inject the URL into the server processing. To be able to do this it needs to know what the corresponding URL-prefix or URL-base is. By default this prefix is the corresponding filepath itself. But at most websites URLs are NOT directly related to physical filename paths, so this assumption will usually be wrong! There you have to use the RewriteBase directive to specify the correct URL-prefix.

    Notice: If your webserver’s URLs are not directly related to physical file paths, you have to use RewriteBase in every .htaccess files where you want to use RewriteRule directives.

    Example:


    Assume the following per-directory config file:

    In the above example, a request to /xyz/oldstuff.html gets correctly rewritten to the physical file /abc/def/newstuff.html .

    Note — For Apache hackers:
    The following list gives detailed information about the internal processing steps: This seems very complicated but is the correct Apache internal processing, because the per-directory rewriting comes too late in the process. So, when it occurs the (rewritten) request has to be re-injected into the Apache kernel! BUT: While this seems like a serious overhead, it really isn’t, because this re-injection happens fully internally to the Apache server and the same procedure is used by many other operations inside Apache. So, you can be sure the design and implementation is correct.

    RewriteCond

    The RewriteCond directive defines a rule condition. Precede a RewriteRule directive with one or more RewriteCond directives. The following rewriting rule is only used if its pattern matches the current state of the URI and if these additional conditions apply too.

    TestString is a string which can contains the following expanded constructs in addition to plain text:

      RewriteRule backreferences: These are backreferences of the form

    where NAME_OF_VARIABLE can be a string taken from the following list:

    HTTP headers:

    HTTP_USER_AGENT
    HTTP_REFERER
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT

    connection & request:

    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE

    server internals:

    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE

    system stuff:

    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME

    API_VERSION
    THE_REQUEST
    REQUEST_URI
    REQUEST_FILENAME
    IS_SUBREQ

    Notice: These variables all correspond to the similarly named HTTP MIME-headers, C variables of the Apache server or struct tm fields of the Unix system. Most are documented elsewhere in the Manual or in the CGI specification. Those that are special to mod_rewrite include:

    IS_SUBREQ Will contain the text «true» if the request currently being processed is a sub-request, «false» otherwise. Sub-requests may be generated by modules that need to resolve additional files or URIs in order to complete their tasks. API_VERSION This is the version of the Apache module API (the internal interface between server and module) in the current httpd build, as defined in include/ap_mmn.h. The module API version corresponds to the version of Apache in use (in the release version of Apache 1.3.14, for instance, it is 19990320:10), but is mainly of interest to module authors. THE_REQUEST The full HTTP request line sent by the browser to the server (e.g., » GET /index.html HTTP/1.1 «). This does not include any additional headers sent by the browser. REQUEST_URI The resource requested in the HTTP request line. (In the example above, this would be «/index.html».) REQUEST_FILENAME The full local filesystem path to the file or script matching the request.

    1. The variables SCRIPT_FILENAME and REQUEST_FILENAME contain the same value, i.e., the value of the filename field of the internal request_rec structure of the Apache server. The first name is just the commonly known CGI variable name while the second is the consistent counterpart to REQUEST_URI (which contains the value of the uri field of request_rec ).
    2. There is the special format: % where variable can be any environment variable. This is looked-up via internal Apache structures and (if not found there) via getenv() from the Apache server process.
    3. There is the special format: % where header can be any HTTP MIME-header name. This is looked-up from the HTTP request. Example: % is the value of the HTTP header « Proxy-Connection: ».
    4. There is the special format % for look-aheads which perform an internal (URL-based) sub-request to determine the final value of variable. Use this when you want to use a variable for rewriting which is actually set later in an API phase and thus is not available at the current stage. For instance when you want to rewrite according to the REMOTE_USER variable from within the per-server context ( httpd.conf file) you have to use % because this variable is set by the authorization phases which come after the URL translation phase where mod_rewrite operates. On the other hand, because mod_rewrite implements its per-directory context ( .htaccess file) via the Fixup phase of the API and because the authorization phases come before this phase, you just can use % there.
    5. There is the special format: % which performs an internal (filename-based) sub-request to determine the final value of variable. Most of the time this is the same as LA-U above.

    CondPattern is the condition pattern, i.e., a regular expression which is applied to the current instance of the TestString, i.e., TestString is evaluated and then matched against CondPattern.

    Remember: CondPattern is a standard Extended Regular Expression with some additions:

    1. You can prefix the pattern string with a ‘ ! ‘ character (exclamation mark) to specify a non-matching pattern.
    2. There are some special variants of CondPatterns. Instead of real regular expression strings you can also use one of the following:
      • CondPattern‘ (is lexically greater)
        Treats the CondPattern as a plain string and compares it lexically to TestString. True if TestString is lexically greater than CondPattern.
      • =CondPattern‘ (is lexically equal)
        Treats the CondPattern as a plain string and compares it lexically to TestString. True if TestString is lexically equal to CondPattern, i.e the two strings are exactly equal (character by character). If CondPattern is just «» (two quotation marks) this compares TestString to the empty string.
      • -d‘ (is directory)
        Treats the TestString as a pathname and tests if it exists and is a directory.
      • -f‘ (is regular file)
        Treats the TestString as a pathname and tests if it exists and is a regular file.
      • -s‘ (is regular file with size)
        Treats the TestString as a pathname and tests if it exists and is a regular file with size greater than zero.
      • -l‘ (is symbolic link)
        Treats the TestString as a pathname and tests if it exists and is a symbolic link.
      • -F‘ (is existing file via subrequest)
        Checks if TestString is a valid file and accessible via all the server’s currently-configured access controls for that path. This uses an internal subrequest to determine the check, so use it with care because it decreases your servers performance!
      • -U‘ (is existing URL via subrequest)
        Checks if TestString is a val >
        Notice: All of these tests can also be prefixed by an exclamation mark (‘!’) to negate their meaning.


    Additionally you can set special flags for CondPattern by appending

    Example:

    To rewrite the Homepage of a site according to the « User-Agent: » header of the request, you can use the following:

    Interpretation: If you use Netscape Navigator as your browser (which identifies itself as ‘Mozilla’), then you get the max homepage, which includes Frames, etc. If you use the Lynx browser (which is Terminal-based), then you get the min homepage, which contains no images, no tables, etc. If you use any other browser you get the standard homepage.

    RewriteRule

    The RewriteRule directive is the real rewriting workhorse. The directive can occur more than once. Each directive then defines one single rewriting rule. The definition order of these rules is important, because this order is used when applying the rules at run-time.

    Pattern can be (for Apache 1.1.x a System V8 and for Apache 1.2.x and later a POSIX) regular expression which gets applied to the current URL. Here «current» means the value of the URL when this rule gets applied. This may not be the originally requested URL, because any number of rules may already have matched and made alterations to it.

    Some hints about the syntax of regular expressions:

    For more information about regular expressions either have a look at your local regex(3) manpage or its src/regex/regex.3 copy in the Apache 1.3 distribution. If you are interested in more detailed information about regular expressions and their variants (POSIX regex, Perl regex, etc.) have a look at the following dedicated book on this topic:

    Mastering Regular Expressions
    Jeffrey E.F. Friedl
    Nutshell Handbook Series
    O’Reilly & Associates, Inc. 1997
    ISBN 1-56592-257-3

    Additionally in mod_rewrite the NOT character (‘ ! ‘) is a possible pattern prefix. This gives you the ability to negate a pattern; to say, for instance: «if the current URL does NOT match this pattern». This can be used for exceptional cases, where it is easier to match the negative pattern, or as a last default rule.

    Notice: When using the NOT character to negate a pattern you cannot have grouped wildcard parts in the pattern. This is impossible because when the pattern does NOT match, there are no contents for the groups. In consequence, if negated patterns are used, you cannot use $N in the substitution string!

    Substitution of a rewriting rule is the string which is substituted for (or replaces) the original URL for which Pattern matched. Beside plain text you can use

    1. back-references $N to the RewriteRule pattern
    2. back-references %N to the last matched RewriteCond pattern
    3. server-variables as in rule condition test-strings ( % )
    4. mapping-function calls ( $ )

    Back-references are $ N (N=0..9) identifiers which will be replaced by the contents of the Nth group of the matched Pattern. The server-variables are the same as for the TestString of a RewriteCond directive. The mapping-functions come from the RewriteMap directive and are explained there. These three types of variables are expanded in the order of the above list.

    As already mentioned above, all the rewriting rules are applied to the Substitution (in the order of definition in the config file). The URL is completely replaced by the Substitution and the rewriting process goes on until there are no more rules unless explicitly terminated by a L flag — see below.

    There is a special substitution string named ‘ — ‘ which means: NO substitution! Sounds silly? No, it is useful to provide rewriting rules which only match some URLs but do no substitution, e.g., in conjunction with the C (chain) flag to be able to have more than one pattern to be applied before a substitution occurs.

    One more note: You can even create URLs in the substitution string containing a query string part. Just use a question mark inside the substitution string to indicate that the following stuff should be re-injected into the QUERY_STRING. When you want to erase an existing query string, end the substitution string with just the question mark.

    Note: There is a special feature: When you prefix a substitution field with https:// thishost[:thisport] then mod_rewrite automatically strips it out. This auto-reduction on implicit external redirect URLs is a useful and important feature when used in combination with a mapping-function which generates the hostname part. Have a look at the first example in the example section below to understand this.
    Remember: An unconditional external redirect to your own server will not work with the prefix https://thishost because of this feature. To achieve such a self-redirect, you have to use the R-flag (see below).

    Additionally you can set special flags for Substitution by appending

    » into « /u/ » or always append a slash to /u/ user, etc.

    Note: When you use this flag, make sure that the substitution field is a valid URL! If not, you are redirecting to an invalid location! And remember that this flag itself only prefixes the URL with https://thishost[:thisport]/ , rewriting continues. Usually you also want to stop and do the redirection immediately. To stop the rewriting you also have to provide the ‘L’ flag.

  • forbidden|F ‘ (force URL to be forbidden)
    This forces the current URL to be forbidden, i.e., it immediately sends back a HTTP response of 403 (FORBIDDEN). Use this flag in conjunction with appropriate RewriteConds to conditionally block some URLs.
  • gone|G ‘ (force URL to be gone)
    This forces the current URL to be gone, i.e., it immediately sends back a HTTP response of 410 (GONE). Use this flag to mark pages which no longer exist as gone.

  • proxy|P ‘ (force proxy)
    This flag forces the substitution part to be internally forced as a proxy request and immediately (i.e., rewriting rule processing stops here) put through the proxy module. You have to make sure that the substitution string is a valid URI (e.g., typically starting with https:// hostname) which can be handled by the Apache proxy module. If not you get an error from the proxy module. Use this flag to achieve a more powerful implementation of the ProxyPass directive, to map some remote stuff into the namespace of the local server.

    Notice: To use this functionality make sure you have the proxy module compiled into your Apache server program. If you don’t know please check whether mod_proxy.c is part of the « httpd -l » output. If yes, this functionality is available to mod_rewrite. If not, then you first have to rebuild the « httpd » program with mod_proxy enabled.

  • last|L ‘ (last rule)
    Stop the rewriting process here and don’t apply any more rewriting rules. This corresponds to the Perl last command or the break command from the C language. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules. For example, use it to rewrite the root-path URL (‘ / ‘) to a real one, e.g., ‘ /e/www/ ‘.
  • next|N ‘ (next round)
    Re-run the rewriting process (starting again with the first rewriting rule). Here the URL to match is again not the original URL but the URL from the last rewriting rule. This corresponds to the Perl next command or the continue command from the C language. Use this flag to restart the rewriting process, i.e., to immediately go to the top of the loop.
    But be careful not to create an infinite loop!
  • chain|C ‘ (chained with next rule)
    This flag chains the current rule with the next rule (which itself can be chained with the following rule, etc.). This has the following effect: if a rule matches, then processing continues as usual, i.e., the flag has no effect. If the rule does not match, then all following chained rules are skipped. For instance, use it to remove the « .www » part inside a per-directory rule set when you let an external redirect happen (where the « .www » part should not to occur!).
  • type|T =MIME-type‘ (force MIME type)
    Force the MIME-type of the target file to be MIME-type. For instance, this can be used to simulate the mod_alias directive ScriptAlias which internally forces all files inside the mapped directory to have a MIME type of « application/x-httpd-cgi ».
  • nosubreq|NS ‘ (used only if no internal sub-request)
    This flag forces the rewriting engine to skip a rewriting rule if the current request is an internal sub-request. For instance, sub-requests occur internally in Apache when mod_include tries to find out information about possible directory default files ( index.xxx ). On sub-requests it is not always useful and even sometimes causes a failure to if the complete set of rules are applied. Use this flag to exclude some rules.

    Use the following rule for your decision: whenever you prefix some URLs with CGI-scripts to force them to be processed by the CGI-script, the chance is high that you will run into problems (or even overhead) on sub-requests. In these cases, use this flag.

  • nocase|NC ‘ (no case)
    This makes the Pattern case-insensitive, i.e., there is no difference between ‘A-Z’ and ‘a-z’ when Pattern is matched against the current URL.
  • qsappend|QSA ‘ (query string append)
    This flag forces the rewriting engine to append a query string part in the substitution string to the existing one instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.
  • noescape|NE ‘ (no URI escaping of output)
    This flag keeps mod_rewrite from applying the usual URI escaping rules to the result of a rewrite. Ordinarily, special characters (such as ‘%’, ‘$’, ‘;’, and so on) will be escaped into their hexcode equivalents (‘%25’, ‘%24’, and ‘%3B’, respectively); this flag prevents this from being done. This allows percent symbols to appear in the output, as in which would turn ‘ /foo/zed ‘ into a safe request for ‘ /bar?arg=P1=zed ‘.
    Notice: The noescape flag is only available with Apache 1.3.20 and later versions.
  • passthrough|PT ‘ (pass through to next handler)
    This flag forces the rewriting engine to set the uri field of the internal request_rec structure to the value of the filename field. This flag is just a hack to be able to post-process the output of RewriteRule directives by Alias , ScriptAlias , Redirect , etc. directives from other URI-to-filename translators. A trivial example to show the semantics: If you want to rewrite /abc to /def via the rewriting engine of mod_rewrite and then /def to /ghi with mod_alias : If you omit the PT flag then mod_rewrite will do its job fine, i.e., it rewrites uri=/abc/. to filename=/def/. as a full API-compliant URI-to-filename translator should do. Then mod_alias comes and tries to do a URI-to-filename transition which will not work.

    Note: You have to use this flag if you want to intermix directives of different modules which contain URL-to-filename translators. The typical example is the use of mod_alias and mod_rewrite ..

  • skip|S =num‘ (skip next rule(s))
    This flag forces the rewriting engine to skip the next num rules in sequence when the current rule matches. Use this to make pseudo if-then-else constructs: The last rule of the then-clause becomes skip=N where N is the number of rules in the else-clause. (This is not the same as the ‘chain|C’ flag!)
  • env|E=VAR:VAL‘ (set environment variable)
    This forces an environment variable named VAR to be set to the value VAL, where VAL can contain regexp backreferences $N and %N which will be expanded. You can use this flag more than once to set more than one variable. The variables can be later dereferenced in many situations, but usually from within XSSI (via ) or CGI (e.g. $ENV <'VAR'>). Additionally you can dereference it in a following RewriteCond pattern via % . Use this to strip but remember information from URLs.
  • Note: Never forget that Pattern is applied to a complete URL in per-server configuration files. But in per-directory configuration files, the per-directory prefix (which always is the same for a specific directory!) is automatically removed for the pattern matching and automatically added after the substitution has been done. This feature is essential for many sorts of rewriting, because without this prefix stripping you have to match the parent directory which is not always possible.

    There is one exception: If a substitution string starts with « https:// » then the directory prefix will not be added and an external redirect or proxy throughput (if flag P is used!) is forced!

    Note: To enable the rewriting engine for per-directory configuration files you need to set « RewriteEngine On » in these files and « Options FollowSymLinks » must be enabled. If your administrator has disabled override of FollowSymLinks for a user’s directory, then you cannot use the rewriting engine. This restriction is needed for security reasons.

    Here are all possible substitution combinations and their meanings:

    Inside per-server configuration ( httpd.conf )
    for request « GET /somepath/pathinfo »:

    Inside per-directory configuration for /somepath
    (i.e., file .htaccess in dir /physical/path/to/somepath containing RewriteBase /somepath )
    for request « GET /somepath/localpath/pathinfo »:

    Example:


    We want to rewrite URLs of the form

    Как включить mod_rewrite в Windows

    mod_rewrite предоставляет возможность динамически изменять входящие URL-запросы, основываясь на правилах, использующих регулярные выражения.

    mod_rewrite – это опциональный (необязательный) модуль веб-сервера Apache, который по умолчанию отключён. Поэтому работу с mod_rewrite нужно начать с его включения в веб-сервере. Правила для преобразования URL-запросов записываются в .htaccess. Это означает, что для работы mod_rewrite нужно:

    • включить непосредственно сам mod_rewrite
    • включить поддержку файлов .htaccess

    Для включения mod_rewrite, в файле httpd.conf (C:\Server\bin\Apache24\conf\httpd.conf) найдите и раскомментируйте строку:

    Для включения поддержки файла .htaccess в конфигурационном файле Apache httpd.conf (C:\Server\bin\Apache24\conf\httpd.conf) найдите группу строк:

    В Windows она может выглядеть так:

    В этой группе строк замените

    Сохраните файл настройки Apache и перезапустите сам веб-сервер. Если вы не знаете, как это сделать, то просто перезагрузите компьютер.

    Если вам нужна подробная инструкция о том, как использовать mod_rewrite и как писать правила, то обратитесь к «Полному руководству по mod_rewrite».

    Модуль mod_rewrite сервера Apache

    Модуль mod_rewrite веб сервера Apache используется для преобразования URL адресов. С его помощью можно настраивать редиректы, изменять URL адреса, блокировать доступ и т.д. По умолчанию этот модуль выключен, для того что бы его включить, в .htaccess необходимо добавить следующие директивы:

    • RewriteEngine On — директива включает модуль.
    • RewriteBase — указывает путь от корня сайта до файла .htaccess . Если .htaccess лежит в корне, то указывать этот параметр нужно как в примере, если во внутреннем каталоге, то указываем путь к этому каталогу, например /images/ .

    Если .htaccess лежит в корне, то директиву RewriteBase можно опустить.

    Работа модуля основана на наборе правил и условий, согласно которым производится преобразование. При получении запроса, Apache передает в mod_rewrite путь к файлу начиная от того места, где находится файл .htaccess , остальная часть пути обрезается. Если поступил запрос

    а .htaccess лежит в корне, то в mod_rewrite попадет some/path/file.html (без слеша в начале). Если .htaccess лежит в директории /some/ , то в mod_rewrite попадет path/file.html .

    Далее mod_rewrite анализирует правила в .htaccess и действует согласно этих правил. Стоит знать, что mod_rewrite работает не со ссылками и не с URL адресами, а с обычными строками. То есть адрес, который нужно преобразовать, передается mod_rewrite как обычная строка, и эту строку можно преобразовать как угодно. Для построения правил используются две директивы, RewriteCond и RewriteRule .

    • Директива RewriteCond — здесь определяются условия, при которых сработает правило преобразования RewriteRule . Если условие в RewriteCond выполнено, выполняется правило в RewriteRule . Таких условий перед правилом RewriteRule может быть неограниченное количество. RewriteCond не является обязательной директивой для создания правила преобразования и может отсутствовать.
    • Директива RewriteRule — здесь уже указывается само правило для преобразования, которое для конкретного преобразования должно быть единственным.


    Директива RewriteRule

    Синтаксис директивы RewriteRule :

    • Шаблон — условие, выполнение которого запускает исполнение правила;
    • Подстановка — правило изменения (преобразования) URL;
    • [Флаги] — дополняют преобразование URL.

    Дефис вместо Подстановка означает, что преобразование URL не требуется.

    Некоторые флаги RewriteRule :

    • [NC] — Это делает Шаблон нечуствительным к регистру, когда Шаблон применяется к текущему URL.
    • [QSA] — Добавить строку запроса из исходного URL к строке запроса, созданной правилами перезаписи.
    • [L] — Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований.
    • [N] — Перезапустить процесс преобразований (начав с первого правила). В этом случае URL снова сопоставляется неким условиям, но не оригинальный URL, а URL вышедший из последнего правила преобразования.
    • [F] — Сервер возвращает браузеру ошибку с кодом 403.
    • [R] — Редирект с кодом ответа браузеру 302 (временно перемещен).
    • [R=code] — Редирект с кодом ответа браузеру code .

    Флаг QSA (Query String Append)

    Строкой запроса является часть запрашиваемого адреса, которая следует после символа знак вопроса. К примеру, в запросе

    строкой запроса является выделенная красным часть.

    Когда заменяющий URI (полученный после применения правил перезаписи) содержит строку запроса, поведение по умолчанию RewriteRule — отбросить исходную строку запроса и заменить её сгенерированной новой. Использование флага [QSA] приводит к объединению строк запроса.

    С флагом [QSA] , запрос

    будет преобразован в

    Без флага [QSA] , этот же самый запрос будет преобразован в

    То есть, существующая строка запроса будет отброшена.

    Директива RewriteCond

    Синтаксис директивы RewriteCond :

    • СравниваемаяСтрока — строка, которая будет проверятся на соответствие выражению, указанному в параметре Условие .
    • Условие — это логическое выражение, по которому проверяется параметр СравниваемаяСтрока . Часто в Условие применяют регулярные выражения.
    • [Флаги] — позволяют задать дополнительные опции, например, можно установить логику объединения правил RewriteCond через логическое И [AND] (по умолчанию) или через логическое ИЛИ [OR] . Или, будет ли сравнение в условии RewriteCond выполнятся с учетом регистра или без учета регистра.

    Пример нескольких директив RewriteCond , объединенных через логическое И [AND] (по умолчанию):

    Несмотря на то, что директива RewriteCond стоит выше, чем правило RewriteRule , mod_rewrite сначала проверяет строку на соответствие с шаблоном в RewriteRule , и если строка совпадает с шаблоном, он смотрит на указанные выше условия в RewriteCond . Если условия тоже совпадают, происходит преобразование согласно правилу RewriteRule .

    СравниваемаяСтрока может, к примеру, содержать часть или весь URL. Подставить в параметр СравниваемаяСтрока часть URL можно при помощи переменных подстановки ( $1 , $2 , $3 ), которые были созданы в соответствующем RewriteRule . Также параметр СравниваемаяСтрока может содержать различные переменные из окружения сервера Apache: % , % , % и т.д.

    Условие может содержать специальные символы:

    • -d — проверка, что директория существует;
    • -f — проверка, что файл существует.


    Дополнительно, перед условием, допускается использование логических символов:

    • !Условие — инвертирование значения, т.е. сравниваемая строка должна не соответствовать шаблону условия;
    • =Условие — Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока . Истинно, если эти две строки полностью одинаковы (символ в символ). Если Условие имеет вид «» — это сравнивает СравниваемаяСтрока с пустой строкой.

    Некоторые флаги RewriteCond :

    • [NC] (от No Case ) — Регистр не имеет значения, как в СравниваемаяСтрока так и в Условие . Этот флаг эффективен только для сравнений между СравниваемаяСтрока и Условие , он не работает при проверках в файловой системе.
    • [OR] — Логическое ИЛИ. Используется, когда перед директивой RewriteRule находится несколько директив RewriteCond и правило в RewriteRule должно быть выполнено при совпадении любого RewriteCond .​
    • [AND] — Логическое И. Используется, когда перед директивой RewriteRule находится несколько директив RewriteCond и правило в RewriteRule должно быть выполнено при совпадении всех RewriteCond . Этот флаг используется по умолчанию, так что его можно опускать.

    Регулярные выражения

    Текст

    • . — Любой одиночный символ
    • [chars] — Класс символов: один из символов
    • [^chars] — Класс символов: ни один из символов
    • (text1|text2) — Альтернатива: text1 или text2

    Кванторы

    • ? — 0 или 1 из предшествующего текста
    • * — 0 или больше из предшествующего текста
    • + — 1 или больше из предшествующего текста

    Группировка

    • (text) — Группировка текста (для установки границ альтернативы или для создания переменных $1 , $2 , $3 или %1 , %2 , %3 )

    Маркеры

    Экранирование


    • \char — экранирование конкретного символа (к примеру, для указания символов .[]() и т.д.)

    Переменные окружения сервера

    Если запрашивается документ:

    то переменные окружения сервера будут:

    DOCUMENT_ROOT

    Переменная Описание Значение Путь к корневой папке сайта. Зависит от операционной системы сервера и используемого программного обеспечения. D:/work/localhost16/www
    HTTP_ACCEPT Типы файлов, которые способен принять браузер. В качестве значения возвращается список поддерживаемых MIME-типов разделенных между собой запятой. text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */*;q=0.8
    HTTP_HOST Доменное имя сайта. Переменная вернёт тот адрес сайта, который указан в адресной строке браузера. www.host16.ru
    HTTP_REFERER Адрес страницы, с которой пользователь перешел на данный сайт, он еще называется реферер.
    HTTP_USER_AGENT Идентификатор используемого браузера и операционной системы. В качестве значения возвращается строка, содержащая ключевые слова. Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    QUERY_STRING Запрос, который указан в адресной строке после вопросительного знака. param=value
    REMOTE_ADDR IP-адрес посетителя сайта 127.0.0.1
    REQUEST_FILENAME Полный путь в файловой системе сервера к файлу или скрипту. По факту содержит те же данные, что и SCRIPT_FILENAME . D:/work/localhost16/www/some/path/index.php
    REQUEST_METHOD Метод отправки данных на сервер, по умолчанию применяется метод GET. GET
    REQUEST_URI Адрес запрашиваемого документа, отсчёт ведётся от корня сайта. /some/path/index.php?param=value
    SERVER_PROTOCOL Протокол для получения и отправки данных. HTTP/1.1
    SCRIPT_NAME Путь к текущему исполняемому скрипту. /some/path/index.php
    SCRIPT_FILENAME Абсолютный путь к исполняемому скрипту. D:/work/localhost16/www/some/path/index.php
    SERVER_NAME Имя сервера. www.host16.ru
    THE_REQUEST Полная строка HTTP запроса, отправленная браузером серверу. Она не включает какие-либо дополнительные заголовки, отправляемые браузером. GET /some/path/index.php?param=value HTTP/1.1

    Переменные подстановки RewriteCond и RewriteRule

    Если в директивах RewriteCond и/или RewriteRule часть символов заключить в круглые скобки, то можно обращаться к содержимому в этих скобках через переменные $1 , $2 , $3 и/или %1 , %2 , %3 :

    • $n — позволяет использовать группу символов из шаблона директивы RewriteRule ;
    • %n — позволяет использовать группу символов из шаблона директивы RewriteCond .

    Как включить mod_rewrite в Apache2?

    Любой вебмастер рано или поздно покупает в свое хозяйство VPS -сервер, на котором будет разворачивать свои эксперименты. Я уже сейчас дорос до этого, поэтому прикупил новый хостинг, на котором потихоньку буду разворачивать новые проекты и пытаться настраивать сервер до боевого состояния (как никак админ же).

    После установки связки Apapche+MySQL+PHP у меня возникла проблема, которая приводила к невозможности выбора на сайтах Textpattern другого режима постоянных ссылок, кроме беспорядка.

    Как оказалась проблема кроется в отсутствии mod_rewrite.

    В большинстве случаев для того, чтобы активировать mod_rewrite в Apache2 необходимо выполнить 1 команду и после перезагрузить сервер, но случается, что этот способ не работает, поэтому привожу другой способ сделать это. Так сказать, чтобы наверняка.

    Включаем mod_rewrite в Apache2 двумя способами:

    • Способ №1простой
      1. Активируем mod_rewrite командой:
      2. перегружаем Apache2:

    или

  • Способ №2сложный, но 100% рабочий
    1. переходим в /etc/apache2/mods-enabled:
    2. создаем символьную ссылку на rewrite.load:
    3. открываем для редактирования конфигурационный файл /etc/apache2/sites-available/default:

      на

      перезапускаем демон Apache2:

      Если будут какие-то вопросы, то пишите, постараюсь помочь.

      Что такое RewriteRule и для чего он нужен

      Начнем с основного, а именно с определения забугорных букв, сложившихся в слово mod_rewrite.

      mod_rewrite – является модулем сервера Apache, он служит для разнообразной манипуляции над URL.

      Чаще всего это подразумевает получения адреса от пользователя, и отправка данных ему с другого адреса.

      К примеру, пользователь вводит: //semantica.in/blog/redirekt-navodit-porjadci-bnmvx.html

      Можно предположить, что Apache отправит пользователю обратно содержание файла redirekt-navodit-porjadci-bnmvx.html. Но благодаря Apache mod_rewrite можно отправить данные с другого файла, например:

      Изменение адреса происходит внутри сервера Apache.

      Визуально URL в браузере никак не изменится, он останется таким же, как и был //semantica.in/blog/redirekt-navodit-porjadci-bnmvx.html . Но содержание будет с другой страницы. В этом и заключается отличие от перенаправления HTTP, которое показывает URL страницы информатора.

      Хотя благодаря модулю mod_rewrite можно включить перенаправление HTTP, а также много других полезных функций.

      Самые жирные функции, которые можно реализовать с помощью mod_rewrite

      1. Создание «Дружественных» URL адресов, которые используются для маскировки «кривых» URL

      При написании скрипта example.php, например, для вывода статей, вы можете оформить ссылку на статью, используя такой URL:

      Данный URL выглядит некрасиво и запрос (?exaple >

      Преобразовать URL в таком случае нам поможет mod_rewrite. Что нам нужно сделать? В корне сайта находится файл .htaccess, допишем в него:

      Теперь рассмотрим правило RewriteRule подробнее:

        ^articles/([^/]+)/?$ — регулярное выражение, имеющее соответствие с любым URL адресом в формате articles/ (article >

      2. Блокировка возможности использования ссылок в изображениях на сайте

      Также модуль mod_rewrite может запретить использовать ссылки на изображения. Допустим, существует страница вашего сайта //semantica.in/page.html, в которой содержится такой тег img:

      Любой другой ресурс может позаимствовать вашу картинку:

      Можно сделать вывод, что частично трафик вашего сервера используется ресурсом, стащившим вашу картинку для отображения картинки на своей странице. Это может стать проблемой, если у стороннего сайта большой трафик.

      Чтобы избежать таких проблем, в файле .htaccess дописываем:

      Разберем как работает этот код:

      • RewriteEngine on — включаем mod_rewrite
      • RewriteCond % !^$- RewriteCond — директива mod_rewrite. Директива устанавливает условие, которое выполняется для обработки URL следующим правилом RewriteRule. В нашем случае условием будет значение в переменной HTTP_REFERER.
      • RewriteCond % !^https://(www.)?semantica.in/.*$ [NC] — вторая директива ставит условие — значение переменной HTTP_REFERER не должно начинаться с https://www.semantica.in/ или //semantica.in/. [NC] — флаг устанавливает чувствительность к регистру символов.
      • RewriteRule .+.(gif|jpg|png)$ — [F]— правило пропускается, если два условия RewriteCond не выполнены. Само же правило возвращает ошибку «403 Forbidden»

      3. Исключение ошибки 404 в период реорганизации сайта

      При реорганизации содержания сайта, возможно изменение URL страницы. В этом случае, в выдаче новый URL появится через какое-то время. Получается, что при переходе по старой ссылке из выдачи поисковика или какого-нибудь ссылающегося сайта, пользователь увидит ошибку 404.

      Здесь нам опять поможет модуль Apache mod_rewrite, предназначенный для реализации 301 редиректа. HTTP отсылает браузеру старый адрес, информируя, что у страницы новый адрес URL.

      Необходимо дописать в файл .htaccess:

      Далее рассмотрим подробнее как работает правило RewriteRule в этом случае:

      • ^semantica.html$ — регулярное выражение, значению которого соответствует старый адрес URL страницы. Значение шаблона: «соответствует началу адреса (^), за которым будет текст ‘ semantica.html’, за которым будет символ окончания адреса ($).»
      • /new_semantica.html — вторая часть описывает, на какое выражение нужно менять. В нашем случае это /new_semantica.html.
      • [R=301,L] — используется 2 флага: R=301 означает «301 редирект на новый URL»; L – флаг для прекращения последующей обработки этого URL адреса.

      Разберем подробнее как работает mod_rewrite

      Итак, вы поняли (надеюсь), что такое mod_rewrite. Теперь самое время познакомится с директивой RewriteRule . Эта директива может встречаться много раз, и каждый раз будет определять новое правило преобразования.

      Чтобы понять как работает RewriteRule, необходимо знать с чем он работает. Для этого рассмотрим, как Apachе получает строку, которая передается на обработку RewriteRule в .htaccess.

      Поначалу кажется, что mod_rewrite работает с ссылками, но в случае mod_rewrite htaccess это не так.

      На самом деле в RewriteRule передается не ссылка, а путь к файлу.

      Из-за своей внутренней архитектуры сервер Apache в момент, когда работает .htaccess, mod_rewrite, может манипулировать путем файла, который должен быть обработан. Это происходит из-за других модулей, которые могли изменить запрос до передачи в модуль . Поэтому в mod _ rewrite передается абсолютный путь файла. А также модуль знает путь до .htaccess в котором заданы правила RewriteRule . Для того чтобы из пути сделать ссылку, модуль отрезает от абсолютного пути часть до .htaccess.

      Путь, от которого отрезан .htaccess, передается в первый rewriteRule . Пример :

      • Запрос: //semantica.in/wp-content/themes/semantica/i/sidebar/logo.png
      • Documentroot: /var/www/ semantica.in
      • Путь файла: /var/www/ semantica.in/wp-content/themes/semantica/i/sidebar/logo.png
      • Путь .htaccess: /var/www/semantica.in/ wp-content/.htaccess
      • В первый RewriteRule передается: themes/semantica/i/sidebar/logo.png

      Важно помнить то, что RewriteRule не обрабатывает аргументы, которые не переданы в скрипт, имя сайта, ссылку, кстати, тоже обрабатывает не всю, если . htaccess лежит не в корне. Для этого существует другой модуль.

      Пример того, как делать не надо

      RewriteRule ^/index.php$ /my-index.php – начинается с /

      RewriteRule ^example.com/.* https://www.semantica. in – RewriteRule не анализирует название сайта

      RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1 in – аргументы не попадают в RewriteRule

      Вот , что из себя представляет htaccess RewriteRule. Надеюсь, было полезно

      – Только качественный трафик из Яндекса и Google
      – Понятная отчетность о работе и о планах работ
      – Полная прозрачность работ

      Apache модуль mod_rewrite

      • База знаний cPanel хостинг
      • Web сервер Apache
      • Apache модуль mod_rewrite

      Описание: механизм переписывания URL на основе правил
      Статус: расширение
      Идентификатор модуля: rewrite_module
      Исходный файл: mod_rewrite.c

      Модуль mod_rewrite использует механизм перезаписи на основе правил, основанный на синтаксическом анализаторе регулярных выражений PCRE, для перезаписи запрошенных URL-адресов на лету. По умолчанию mod_rewrite отображает URL-адрес в путь файловой системы. Однако его также можно использовать для перенаправления одного URL-адреса на другой URL-адрес или для вызова внутренней прокси-выборки.

      mod_rewrite предоставляет гибкий и мощный способ манипулирования URL-адресами с использованием неограниченного количества правил. Каждое правило может иметь неограниченное количество условий присоединенного правила, чтобы вы могли перезаписать URL-адрес на основе переменных сервера, переменных среды, заголовков HTTP или отметок времени.

      How to enable mod_rewrite for Apache 2.2

      I’ve got fresh install of Apache 2.2 on my Vista machine, everything works fine, except mod rewrite.

      but none of my rewrite rules works, even simple ones like

      All the rules I’m using are working on my hosting, so they should be ok, so my question is, is there any hidden thing in apache configuration, that could block mod rewrite?

      15 Answers 15

      In order to use mod_rewrite you can type the following command in the terminal:

      Restart apache2 after

      or as per new unified System Control Way

      Then, if you’d like, you can use the following .htaccess file.

      The above .htaccess file (if placed in your DocumentRoot ) will redirect all traffic to an index.php file in the DocumentRoot unless the file exists.

      So, let’s say you have the following directory structure and httpdocs is the DocumentRoot

      Any file that exists in httpdocs will be served to the requester using the .htaccess shown above, however, everything else will be redirected to httpdocs/index.php . Your application files in includes/app will not be accessible.

      For my situation, I had

      in my .htaccess , along with the module being loaded, and it was not working.

      The solution to my problem was to edit my vhost entry to inlcude

      in the section for the site in question.

      Try setting: AllowOverride All .

      Second most common issue is not having mod rewrite enabled: a2enmod rewrite and then restart apache.

      If non of the above works try editing /etc/apache2/sites-enabled/000-default

      almost at the top you will find

      Change the AllowOverride None to AllowOverride All

      this worked for me

      mod_rewrite will now be enabled!

      There are many ways how you can fix this issue, if you know the root of the issue.

      Problem 1

      Firstly, it may be a problem with your apache not having the mod_rewrite.c module installed or enabled.

      For this reason, you would have to enable it as follows

      Open up your console and type into it, this:

      sudo a2enmod rewrite

      Restart your apache server.

      service apache2 restart

      Problem 2

      You may also, in addition to the above, if it does not work, have to change the override rule from the apache conf file (either apache2.conf, http.conf , or 000-default file).

      Locate «Directory /var/www/»

      Change the «Override None» to «Override All»

      Problem 3

      If you get an error stating rewrite module is not found, then probably your userdir module is not enabled. For this reason you need to enable it.

      Type this into the console:

      sudo a2enmod userdir

      Then try enabling the rewrite module if still not enabled (as mentioned above).

      Open terminal and typin a2enmod rewrite , It will enable your mod_rewrite module for Apache.

      Then go to /etc/apache2/sites-available and edit default file. (For this you must have writable permissions to this file and sites-available folder.)

      Replace below with existing lines 4 to 14

      Now restart your apache by /etc/init.d/apache2 restart or service apache2 restart

      Take clean URL test again and this time it will be passed.

      New apache version has change in some way. If your apache version is 2.4 then you have to go to /etc/apache2/ . There will be a file named apache2.conf . You have to edit that one(you should have root permission). Change directory text like this

      Now restart apache.

      Just noticed you said mod_rewrite.s instead of mod_rewrite.so — hope that’s a typo in your question and not in the httpd.conf file! 🙂

      I’m more used to using Apache on Linux, but I had to do this the other day.

      First off, take a look in your Apache install directory. (I’ll be assuming you installed it to «C:\Program Files» here)

      Take a look in the folder: «C:\Program Files\Apache Software Foundation\Apache2.2\modules» and make sure that there’s a file called mod_rewrite.so in there. (It should be, it’s provided as part of the default install.

      Next, open up «C:\Program Files\Apache Software Foundation\Apache2.2\conf» and open httpd.conf. Make sure the line:

      Also, if you want to enable the RewriteEngine by default, you might want to add something like

      to the end of your httpd.conf file.

      If not, make sure you specify

      somewhere in your .htaccess file.

      I just did this

      then you have to restart the apache service by following command

      There’s obviously more than one way to do it, but I would suggest using the more standard:

      The first time I struggled with mod_rewrite rules ignoring my traffic, I learned (frustratingly) that I had placed them in the wrong , which meant that my traffic would ignore all of them no matter how well-written they were. Make sure this isn’t happening to you:

      # Change the log location to suit your system. RewriteLog /var/log/apache-rw.log RewriteLogLevel 2

      These parameters will activate if you perform a graceful restart of Apache, so you can recycle them in and closely monitor the mod_rewrite behavior. Once your problem is fixed, turn the RewriteLogLevel back down and celebrate.

      In 100% of my experience, I’ve found that the RewriteLog has helped me discover the problem with my rewrite rules. I can’t recommend this enough. Good luck in your troubleshooting!

      linux-notes.org

      Включить модуль mod_rewrite для Apache в Debian/Ubuntu

      Иногда люди сталкиваются с проблемой — сервер apache не читает ваш файл .htaccess или apache не переписывает URL, а мы используем правильные правила перезаписи в конфигурационных файлах. Это происходит из-за того, что модуль rewrite не включен в apache. Т.к модуль mod_rewrite не включен по умолчанию на сервер, поэтому для использования rewrite, нужно вручную включить mode_rewrite. В моей статье «Включить модуль mod_rewrite для Apache в Debian/Ubuntu» я расскажу как я это могу сделать.

      1. Включение модуля mod_rewrite в Apache2

      Для этого, я использую команду «a2enmod», чтобы включить любые модули в веб-сервере Apache 2. Так что, используйте следующую команду чтобы включить mod_rewrite модуль для apache:

      2. Активировать ReWrite в вирутальном хосте

      После включения модуля ReWrite для Apache необходимо добавить «AllowOverride All» в вашем файле конфигурации для виртуального хоста. Этот параметр также может быть включен в глобальном масштабе, путем редактирования основного файла конфигурации apache:

      3. Перезапуск конфигурации Apache2

      После включения модуля mod_rewrite для Apache нужно перезагрузить сервер Apache2:

      Тема «Включить модуль mod_rewrite для Apache в Debian/Ubuntu» завершена.

      Как переписывать URL-адрес с помощью mod_rewrite для Apache на Debian 8

      Главное меню » Операционная система Debian » Как переписывать URL-адрес с помощью mod_rewrite для Apache на Debian 8

      Это руководство разделено на две части. Первая устанавливает пример веб-сайта и показывает простой пример перезаписи. Вторая часть содержит еще два углубленных примера, часто используемых правил перезаписи.

      Предпосылки

      Следуя этому руководству, вам потребуется:

      • Один сервер Debian 8 установленный с первоначальной настройкой сервера.
      • Apache 2, установленный на сервере, следуя статьи как установить Linux, Apache, MySQL, PHP (LAMP) укладывают на Debian 8.

      Шаг 1 – Включение mod_rewrite

      Во- первых, нам нужно активировать mod_rewrite . Он доступен, но не включен с чистой установкой Apache 2.

      Он активирует модуль или предупреждает вас о том, что модуль уже включен. Чтобы изменения вступили в силу, перезапустите Apache.

      mod_rewrite теперь полностью включен. На следующем шаге мы создадим файл .htaccess , который мы будем использовать, чтобы определить правила перезаписи для редиректа.

      Шаг 2 – Настройка .htaccess

      Файл .htaccess позволяет изменять наши правила перезаписи без доступа к файлам конфигурации сервера. По этой причине, .htaccess имеет решающее значение для безопасности вашего веб – приложения. Период, который предшествует имени файла гарантирует, что файл скрыт.

      Тем не менее, в этом простом примере, увеличение производительности будет незначительным. Кроме того, устанавливая правила .htaccess удобно, особенно с нескольких веб – сайтами на одном сервере. Она не требует перезагрузки сервера, чтобы изменения вступили в силу , и это не требует привилегий суперпользователя для редактирования этих правил, что упрощает техническое обслуживание и внесение изменений и возможные с непривилегированных аккаунтов. Некоторые популярные программы с открытым исходным кодом, такие как WordPress и Joomla, часто полагается на файл .htaccess в программном обеспечении, чтобы изменять и создавать дополнительные правила по требованию.

      Нам нужно будет установить и обеспечить еще несколько настроек, прежде чем мы сможем начать.

      По умолчанию Apache запрещает использование файла .htaccess для применения правил перезаписи, поэтому сначала вам нужно разрешить изменения в файл. Открыть файл конфигурации по умолчанию в Apache, используя nano или ваш любимый текстовый редактор.

      Внутри этого файла вы найдете блок , начиная с первой строки. Внутри этого блока, добавьте следующий новый блок , чтобы ваш файл конфигурации выглядит следующим образом . Убедитесь , что все блоки правильно с отступом.

      Сохраните и закройте файл. Чтобы изменения вступили в силу, перезапустите Apache.

      Теперь создайте файл .htaccess в корневой веб директории.

      Добавьте эту строку в верхней части нового файла, чтобы активировать перезапись.

      Сохраните файл и выйдите.

      Теперь у вас есть оперативный файл .htaccess , который можно использовать для управления правилами маршрутизации вашего веб – приложения. На следующем этапе мы создадим образцы файлов сайта, которые мы будем использовать, чтобы продемонстрировать правила перезаписи.

      Шаг 3 – Настройка перезаписи URL

      Здесь мы установим базовую перезапись URL, которая преобразует URL – адреса в реальные пути к коду. В частности, мы будем разрешать пользователям доступ. https:// your_server_ip /about

      Начнем с создания файла с именем about.html в корневой директории веб.

      Скопируйте следующий HTML-код в файл, а затем сохраните и закройте его.

      Вы можете получить доступ к странице https://your_server_ip/about.html, но обратите внимание, что если вы попытаетесь получить доступ к https://your_server_ip/about, вы увидите ошибку 404 Not Found. Но чтобы пользователи получили доступ к странице с помощью about вместо того, чтобы, переписать правила позволит эта самая функциональность.

      RewriteRules соблюдает следующий формат:

      • RewriteRule определяет директиву.
      • pattern является регулярное выражение, которое соответствует желаемой строки из URL, типы просмотра в браузере.
      • substitution это путь к реальному URL, то есть путь файловых серверов Apache.
      • flags необязательные параметры, которые можно изменять, как работает правило.

      Откройте файл .htaccess .

      После первой строки, добавьте RewriteRule отмеченный красным цветом, и сохраните файл.

      В этом случае, ^about$ это шаблон, about.html это замена, и [NC] является флагом. Наш пример использует несколько символов со специальным значением:

      • ^ указывает на начало URL, после your_server_ip / .
      • $ указывает на конец URL.
      • about соответствует строке “about”.
      • about.html является фактическим файл, который обращается к пользователю.
      • [NC] является флагом, который делает случай правила нечувствительным.

      Теперь, вы должны иметь возможность доступа к https://your_server_ip/about в вашем браузере. На самом деле, с правилом показанным выше, следующие URL – адреса будут указывать about.html:

      • https:// your_server_ip /about , из-за определения правила.
      • https:// your_server_ip /About , Так как правило не чувствительно к регистру.
      • https:// your_server_ip /about.html , так как оригинальное собственное имя файла всегда будет работать.
      • https:// your_server_ip /about/ , потому что правило четко указано, что не может быть ничего после about помощью $ символа.
      • https:// your_server_ip /contact , потому что она не будет соответствовать строке about в правиле.

      Теперь у вас есть оперативный файл .htaccess с простым правилом, вы можете изменить и расширить для ваших потребностей. В следующих разделах мы покажем два дополнительных примера наиболее часто используемых директив.

      Пример 1 – Упрощение строки запросов с RewriteRule

      Веб – приложения часто используют строки запроса, которые добавляются к URL – адресу, используя знак вопроса ( ? ) после адреса. Отдельные параметры разделяются с помощью амперсанда ( & ). Строки запроса могут быть использованы для передачи дополнительных данных между отдельными страницами приложения.

      Например, страницы результатов поиска написанные на PHP, могут использовать URL, как https://example.ru/results.php?item=shirt&author=andreyex . В этом примере два дополнительных параметра передают воображаемый result.php сценария приложения: item со значением shirt и author со значением andreyex . Приложение может использовать информацию строки запроса, чтобы построить правильную страницу для посетителя.

      Правила перезаписи Apache часто используются для упрощения таких длинных и неприглядных ссылок как выше в дружественные URL – адреса, которые легче вводить и интерпретировать визуально. В этом примере, мы хотели бы, упростить ссылку выше, чтобы сделать https://example.ru/shirt/andreyex . shirt и значения параметров author и andreyex к прежнему адресу, но без строки запроса и имени сценария.

      Вот одно правило для реализации этого:

      shirt/andreyex явно сопоставляются в запрашиваемом адресе и Apache указал запустить вместо этого results.php?item=shirt&author=andreyex .

      флаги [QSA] обычно используются в правила[ перезаписи. Они говорят Apache, чтобы добавить любые дополнительные строки запроса к обслуживаемому URL. Без этого, дополнительная строка запроса будет отбрасываются. https://example.ru/shirt/andreyex? page=2 results.php?item=shirt&author=andreyex &page=2

      Хотя этот метод позволяет достичь желаемого эффекта, как имя элемента и author жестко закодированы в правила. Это означает, что правило не будет работать для любыми другими предметами, например pants , или author, как destroyer .

      Для того, чтобы сделать правило более общо, мы можем использовать регулярные выражения, чтобы соответствовать части исходного адреса и использовать те части в схеме замещения. Модифицированное правило будет выглядеть следующим образом :

      Первое регулярное выражение группы в скобках соответствует строке, содержащей буквенно-цифровые символы и цифры, как shirt или pants и сохраняет совпавший фрагмент в качестве переменной $1 . Вторая группа выражений в скобках соответствует точно andreyex , destroyer , fall или spring , и так же сохраняет совпавший фрагмент как $2 .

      Согласованные фрагменты затем в результирующий URL в переменные item и author вместо жёстко shirt и andreyex , которые мы использовали раньше.

      Выше будет преобразовывать, например, https://example.ru/pants/andreyex в https://example.ru/results.php?item=pants&author=andreyex . Этот пример также на будущее, позволяя нескольким элементам и author правильно переписать с использованием единого правила.

      Пример 2 – Добавление условия с помощью логики, используя RewriteConds

      Правила перезаписи не обязательно всегда вычисляются один за другим без каких – либо ограничений. Директива RewriteCond позволяет нам добавлять условия для наших правил перезаписи, чтобы контролировать, когда правила будут обработаны. RewriteConds соблюдает следующий формат:

      • RewriteCond определяет директиву RewriteCond .
      • TestString это тестируемая строка.
      • Condition это шаблон или условие, чтобы соответствовать.
      • Flags необязательные параметры, которые могут изменить правила условий и оценки.

      Если имеет RewriteCond значение истинно, то RewriteRule сразу после будет рассмотрен. Если это не будет, то правило будет отброшено. Многократная RewriteCond может использоваться один за другим, и с поведением по умолчанию, все они должны оценить, верно и в следующем правиле для рассмотрения.

      В качестве примера, давайте предположим, что вы хотели бы перенаправить все запросы на несуществующие файлы и каталоги на вашем сайте обратно на главную страницу вместо того чтобы показывать стандартную страницу ошибку 404 Not Found. Это может быть достигнуто с следующими условиями правил:

      С учетом указанных выше:

      • % это строка для проверки. В этом случае, запрашиваемое имя файла, которое является переменной системой, доступной для каждого запроса.
      • -f встроенное в условие, которое проверяет, существует ли запрашиваемое имя на диске, и является ли файлом. ! — Является оператором отрицания. В сочетании !-f оценивается как истина, только если указанное имя не существует или не является файлом.
      • Аналогичным образом , !-d оценивается как истина, только если указанное имя не существует или не является каталогом.

      RewriteRule На последней строке вступит в силу только для запросов на несуществующие файлы и каталоги. RewriteRule Сама по себе очень проста и перенаправляет каждый запрос на / корень сайта.

      Вывод

      mod_rewrite полезный модуль Apache, который может быть эффективно использован для обеспечения удобочитаемых URL. На этом уроке вы узнали, как использовать директиву RewriteRule для перенаправления URL – адресов, в том числе с строки запроса. Вы также узнали перенаправление URL – адреса с помощью директивы RewriteCond .

      Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

      mod_rewrite в примерах и рекомендациях

      Основы и особенности mod_rewrite, примеры использования mod_rewrite, переменные сервера, флаги (RewriteRule Flags), перенаправление, запрет доступа по времени суток или агенту пользователя, запрет доступа по рефереру или при его отсутствии.

      Мир Вам Братья и Сёстры! По просьбам трудящихся сегодня я здесь типа обучающая программа, которую зовут Олег, и, сегодня мы с Вами попробуем объяснить, самим себе в первую очередь, основные принципы работы чудо-модуля mod_rewrite дабы иметь отчётливое понимание как работают условия и правила, а не просто тупо их копировать/вставлять. Итак, начнём.

      Модуль Apache mod_rewrite является очень мощным, но в то же время сложным, инструментом для манипуляции с URL перенаправлениями/преобразованиями/запретами. С помощью этого чудо-модуля можно выполнять практически любые URL преобразования/манипуляции на стороне сервера.

      Обратите внимание, что для некоторых манипуляций с URL не требуется такой мощный и сложный (особо для начинающих) модуль как mod_rewrite. Для простых задач можно использовать mod_alias. Под словом «мощный» имеется ввиду не только широкие возможности по преобразованию URL-ов, но и повышенный расход ресурсов сервера в сравнении с другими модулями.

      Регулярные выражения mod_rewrite

      mod_rewrite использует Perl Compatible Regular Expression (PCRE — Perl совместимые регулярные выражения). В этой статье, мы не будем подробно описывать использование регулярных выражений имхо этой теме посвящены целые тома книг и в одной статье нельзя охватить данную тематику.

      Для большего понимания механизмов PCRE рекомендую запастись какой-то книгой, например » Книга Джеффри Фридла «Регулярные выражения» «, или как минимум ознакомьтесь с материалами по ссылкам:

      Главное, что нужно помнить, — это то, что в регулярных выражениях используются специальные символы (метасимволы) и обычные символы (литералы). Основными метасимволами являются [ ] \ / ^ $ . | ? * + ( ) < >. Метасимволы всегда нужно экранировать обратным слэшем «\», — это относится к пробелу («\ «), а также тому же обратному слэшу («\\»).

      Нужно помнить, что mod_rewrite использует оригинальный PCRE (Perl совместимые регулярные выражения), но с некоторыми дополнениями:

      • ‘ !Условие ‘ (несоответствие условию)
      • ‘ ‘ (лексически меньше условия)
      • ‘ >Условие ‘ (лексически больше условия)
      • ‘ =Условие ‘ (лексически равно условию)
      • ‘ -d ‘ (является ли каталогом)
      • ‘ -f ‘ (является ли обычным файлом)
      • ‘ -s ‘ (является ли обычным файлом с ненулевым размером)
      • ‘ -l ‘ (является ли символической ссылкой)
      • ‘ -F ‘ (проверка существования файла через подзапрос)
      • ‘ -U ‘ (проверка существования URL через подзапрос)

      Порядок обработки правил mod_rewrite

      Порядок обработки правил mod_rewrite является далеко не очевидным. Правила mod_rewrite составляются примерно в таком порядке:

      Теперь чуть подробнее:

      • RewriteEngine — должна быть одна;
      • RewriteBase — может пригодится при использовании в правилах относительных ссылок, но если относительные ссылки относятся к корню каталога, то данная директива может не использоваться, теоретически может использоваться многократно перед каждым из правил;
      • RewriteCond — условие, которое должно быть соблюдено перед выполнением правила, условий может быть несколько;
      • RewriteRule — собственно само правило, которое выполняется при соблюдении условия.

      Порядок размещения правил .htaccess важен потому что механизм преобразований обрабатывает их в специальном порядке. Строчка за строчкой сначала просматриваются RewriteRule директивы и при соответствии URL шаблону (Pattern, исходный_url) конкретного правила проверяются условия (RewriteCond директивы) относящиеся к этому правилу. Условия (RewriteCond) всегда должны быть перед правилами (RewriteRule)! На рис. ниже показан порядок обработки правил mod_rewrite.

      Как видно, Текущий URL сначала сравнивается с Шаблон правила и при совпадении с шаблоном проверяет условия, если Текущий URL удовлетворяет условиям, то к нему применяется правило и Преобраз. URL идёт дальше на обработку если не указан флаг [L] (last).

      Флаг [L] нужно использовать для каждого правила, разумеется если дальнейшая трансформация URL не требуется.

      Далее директива » RewriteEngine on » не будет упоминаться в примерах, — т.е. будем подразумевать, что она уже была добавлена ранее и в дальнейшем дублировать её мы не будем.

      Переменные mod_rewrite

      В условиях (RewriteCond) и в правилах (RewriteRule) можно использовать переменные сервера.

      1. HTTP headers (RqH — Request Header):

      • HTTP_USER_AGENT — содержит полную строку заголовка «User-Agent:»;
      • HTTP_REFERER — адрес с которого пришел пользователь;
      • HTTP_COOKIE — доступ к списку COOKIE браузера;
      • HTTP_FORWARDED — содержит IP-адрес прокси-сервера или сервера балансировки нагрузки;
      • HTTP_HOST — адрес хоста/сервера, который запросил пользователь, например, example.com;
      • HTTP_PROXY_CONNECTION — содержит лексему соединения (connection-token) «close» или «Keep-Alive», предназначен для согласования постоянных соединений между клиентом и сервером (аналог заголовка Connection);
      • HTTP_ACCEPT — заголовок согласования содержимого, которое поддерживает браузер/клиент пользователя, например » text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 » («тип/подтип», через запятую, где тип – это тип содержимого, а подтип – это уточнение типа.). Если заголовок Accept содержит » Accept: */* » (*/*), то это означает, что клиент готов принять содержимое любого типа.

      2. connection & request (соединение & запрос):

      • REMOTE_ADDR — IP-адрес клиента;
      • REMOTE_HOST — ДНС-имя IP-адреса клиента;
      • REMOTE_PORT — номер текущего порта клиента;
      • REMOTE_USER — содержит имя авторизированного (средствами сервера) пользователя;
      • REMOTE_IDENT — переменная будет установлена только если подключен модуль mod_ >REQUEST_METHOD — метод, которым был сделан запрос, GET|GET|HEAD и т.д.;
      • SCRIPT_FILENAME — полный путь к запрошенному файлу, например /var/www/public_html/script_name.php;
      • PATH_INFO — Содержит предоставленный пользователем путь, который содержится после имени скрипта, но до строки запроса (?). Например, если скрипт был запрошен по URL https://www.example.com/php/path_info.php/some/stuff?foo=bar, то переменная $_SERVER[‘PATH_INFO’] будет содержать /some/stuff.
      • QUERY_STRING — строка GET запроса, если запрошен адрес https://example.com/index.php?var=1&var=2, то QUERY_STRING будет содержать var=1&var=2; AUTH_TYPE — тип аутентификации, если выполнена HTTP-аутентификация, может быть Basic или Digest.

      3. server internals (внутренние сервера):

      • DOCUMENT_ROOT — полный путь к домашнему каталогу пользователя, например /var/www/public_html/
      • SERVER_ADMIN — данные администратора сервера/виртуального_хоста, обычно адрес электронной почты;
      • SERVER_NAME — имя сервера, обычно из директивы ServerName;
      • SERVER_ADDR — IP-адрес сервера;
      • SERVER_PORT — порт сервера;
      • SERVER_PROTOCOL — версия используемого протокола, например HTTP/1.0 или HTTP/1.1;
      • SERVER_SOFTWARE — название/версия сервера.

      4. date and time (системные, дата и время):

      • TIME_YEAR — год, 2014
      • TIME_MON — месяц, 05
      • TIME_DAY — день, 07
      • TIME_HOUR — час, 04 (24)
      • TIME_MIN — минуты, 38
      • TIME_SEC — секунды, 55
      • TIME_WDAY — день недели, 3 (среда)
      • TIME — в формате год-мес-день-час-мин-сек, например 20140514234534

      5. specials (специальные):

      • API_VERSION — в формате «20051115:33»
      • THE_REQUEST — подробности GET/POST запроса, например «GET /index.html HTTP/1.1»
      • REQUEST_URI — относительный УРЛ запроса «/index.html»
      • REQUEST_FILENAME — полный локальный путь к файлу или скрипту в файловой системе, соответствующего запроса
      • IS_SUBREQ — если выполняется подзапрос, то переменная содержит true, в противном случае false
      • HTTPS — on/off, если используется/неиспользуется HTTPS

      6. переменные результата выполнения:

      • $1 — $1, $2 и т.д. образуются при совпадении (шаблона1.*) (шаблона2.*) из RewriteRule
      • %1 — %1, %2 и т.д. образуются при совпадении (шаблона1.*) (шаблона2.*) из RewriteCond

      Дополнительные ссылки по HTTP заголовкам и переменным сервера:

      Флаги mod_rewrite

      Для управления поведением условий (RewriteCond) и правил (RewriteRule) в mod_rewrite используются флаги [флаги] .

      Более подробно о флагах читаем в оригинале:

      Протоколы разрешённые в mod_rewrite

      mod_rewrite будет определять подстановочный УРЛ как внешний если указаны один из протоколов:

      • ajp:// — Apache JServ Protocol
      • balancer:// — Apache Load Balancer
      • ftp:// — File Transfer Protocol
      • gopher:// — Gopher (protocol)
      • https:// — Hypertext Transfer Protocol
      • https:// — Hypertext Transfer Protocol Secure
      • ldap:// — Lightweight Directory Access Protocol
      • nntp:// — Network News Transfer Protocol
      • ldap: — Lightweight Directory Access Protocol
      • mailto: — The mailto URI scheme
      • news: — News Protocol

      .htaccess и порядок размещения правил

      В файле .htaccess, теоретически, директивы можно указывать как попало, за исключением директив относящихся к rewrite_module. Тем не менее лучше соблюдать некую последовательность:

      1. CORE директивы;
      2. Конфигурация модулей.

      Директивы rewrite_module выполняющие перенаправление, а не преобразование, должны быть первыми, в противном же случае после преобразования запроса желаемого перенаправления может не произойти если не учесть произошедшие ранее преобразования.

      Примеры mod_rewrite правил

      Запрет доступа с помощью mod_rewrite

      1. Запрещаем посещать наш веб-сайт в рабочее время:

      Это правило закроет доступ с 8-и вечера и до 7-и утра. Приведённый выше пример специально для любителей копи/пасты содержит преднамеренную ошибку в синтаксисе, HTTP 500 (ошибка сервера), которая повлечёт запись в логе ошибок RewriteRule: bad flag delimiters . Переводится, как плохой разделитель флагов, — вместо [ F ] нужно использовать [F] , т.е. избегать пробелов и прочих разделителей, кроме запятой!

      2. Наглухо запрещаем боту WBSearchBot трогать наш сайт:

      Хотя, немного подправив правило, можно т.с. перевести стрелы на кого-то ещё, так сказать натравить бота на другой сайт, мол . ты что, офонарел!? Иди тренируйся, вон, на нём. :)) (из Х/Ф Операция «Ы» и другие приключения Шурика):

      WBSearchBot (Mozilla/5.0 (compatible; WBSearchBot/1.1; +https://www.warebay.com/bot.html)) довольно агрессивный бот и от него можно смело избавляться.

      3. Запрещаем POST запросы для старых протоколов:

      В предыдущем примере код ответа 303 See Other указан не случайно, — дело в том, что если метод перенаправления (обычно GET) отличается от метода запроса (например POST), то в случае возврата кодов ответа 301-302 вместо автоматического редиректа в браузер будет выдана страница со ссылкой для ручного перехода по ней! В случае же с ответом 303 See Other перенаправление выполняется автоматически методом GET независимо от метода запроса.

      4. Hotlink protection — запрещаем отображение наших изображений с других сайтов:

      mod_rewrite перенаправления

      1. Перенаправляем запрос к сайту https://example.com/ (без www префикса) на https://www.example.com/ (с www префиксом):

      2. Перенаправляем наши RSS/ATOM ленты на FeedBurner

      Обратите внимание, что в конце каждой ссылки в правилах (RewriteRule) стоит символ «?», — он требуется для того, чтобы в конец ссылки, по которой будет перенаправлен запрос, не добавлялись параметры QUERY_STRING! если не указать символ «?», то в итоге перенаправление будет по адресу https://feeds.feedburner.com/remote-shaman-blog?option=com_content&view=featured&Item > и https://feeds.feedburner.com/remote-shaman-forum?format=feed соответственно.

      Итоги

      mod_rewrite является мощным инструментом и с его помощью можно творить чудеса, — это факт! В этой статье не так много примеров, но их валом в сети, а вот материала о том, что к чем и почему в стиле как для полных идиотов практически не встретить. Возможно папизже позднее на эту страницу будут добавлены ещё примеры использования mod_rewrite.

      В этой статье я постарался максимально доходчиво изложить (надеюсь мне это удалось) базовые принципы работы чудо-модуля mod_rewrite, в стиле как для полных идиотов (в хорошем смысле слова;), имхо на собственном опыте знаю как оно иногда тяжко осваивать что-то с ноля и когда маны и принципы этого что-то описаны общими туманными фразами и глубоко техническими терминами.

      Мастер Йода рекомендует:  Фриланс для программистов подборка лучших сайтов
  • Добавить комментарий