A 301 Moved Permanently is an
HTTP response status code indicating that the requested resource has been permanently moved to a new URL provided by the
Location response header. The
3xx category of response codes are used to indicate redirection messages to the client, such that the client will become aware that a redirection to a different resource or URL should take place.
It can be a challenge to differentiate between all the possible HTTP response codes and determine the exact cause of a message like the
301 Moved Permanently code. There are dozens of possible HTTP status codes used to represent the complex relationship between the client, a web application, a web server, and often multiple third-party web services, so determining the cause of a particular status code can be difficult. In this article we’ll examine the
301 Moved Permanently code by looking at a few troubleshooting tips, along with some potential fixes for common problems that might be causing this issue, so let’s get started!
The Problem is Server-Side
Apache uses dummy requests to wake processes that listen for new connections. A dummy request is an HTTP request that Apache sends to itself. These requests, when Apache uses them without SSL, appear in access log files with the remote address set to the local host ( 127.0.0.1 for IPv4 or::1 for IPv6). HttpClient is a HTTP/1.1 compliant HTTP agent implementation based on HttpCore. It also provides reusable components for client-side authentication, HTTP state management, and HTTP connection management. HttpComponents Client is a successor of and replacement for Commons HttpClient 3.x. Users of Commons HttpClient are strongly encouraged to. Update - Infra has acknowledged downtime on Apache Distribution (dist.apache.org) and is investigating. Apr 15, 02:01 UTC Investigating - Apache Distribution (dist.apache.org) is experiencing issues.
Apache HTTP Server versions later than 2.2 will not run on any operating system earlier than Windows 2000. Downloading Apache for Windows The Apache HTTP Server Project itself does not provide binary releases of software, only source code. Individual committers may provide binary packages as a convenience, but it is not a release deliverable. Retrieve the Status Code from the Http Response After sending the Http request – we get back an instance of org.apache.http.HttpResponse – which allows us to access the status line of the response, and implicitly the Status Code.
All HTTP response status codes that are in the
3xx category are considered
redirection messages. Such codes indicate to the user agent (i.e. your web browser) that an additional action is required in order to complete the request and access the desired resource. Unlike gateway related
5xx response codes, like the
502 Bad Gateway Error we’ve looked at recently, which may indicate issues either on an upstream server or the client, the
301 Moved Permanently code generally indicates an issue on the actual web server hosting your application.
That said, the appearance of a
301 Moved Permanently is usually not something that requires much user intervention. Most browsers should automatically detect the
301 Moved Permanently response code and process the redirection action automatically. The web server hosting the application should typically include a special
Location header as part of the response it sends to the client. This
Location header indicates the new URL where the requested resource can be found. For example, if a request comes in to access the URL
https://airbrake.io, but the web server is configured to forces redirection to a secure version using
https, the server response will include the
Location: https://airbrake.io header. This tells the browser that it should redirect this request (as well as all future ones) to
https://airbrake.io to the secured URL of
https://airbrake.io. In most cases, the browser will automatically detect this
301 Moved Permanently response code, read the new
Location URL, and redirect the request to that new location. It is considered best practice to use a
301 Moved Permanently redirection to transition a user agent from HTTP to the secure HTTPS. Thus, if you attempt to go to the insecure URL of https://airbrake.io right now, you’ll automatically be redirected to the HTTPS version of the site (https://airbrake.io).
301 Moved Permanently indicates that something has gone wrong within the
server of your application, we can largely disregard the
301 Moved Permanently occurs, the issue isn’t going to be related to the app installed on your phone or local testing device. Instead, it will be something on the server-side, which is performing most of the logic and processing behind the scenes, outside the purview of the local interface presented to the user.
All of that said, if your application is generating
301 Moved Permanently codes improperly or unexpectedly, there are a number of steps you can take to diagnose the problem.
Start With a Thorough Application Backup
As with anything, it’s better to have played it safe at the start than to screw something up and come to regret it later on down the road. As such, it is critical that you perform a full backup of your application, database, and so forth, before attempting any fixes or changes to the system. Even better, if you have the capability, create a complete copy of the application onto a secondary
staging server that isn’t “live,” or isn’t otherwise active and available to the public. This will give you a clean testing ground with which to test all potential fixes to resolve the issue, without threatening the security or sanctity of your live application.
Diagnosing a 301 Moved Permanently Response Code
301 Moved Permanently response code indicates that the server believes that the requested resource is invalid and that the request should be redirected to a new, “proper” URL. I use the word
believes here because it’s entirely possible that the server is misconfigured or bugged in some way, which is causing it to provide
301 Moved Permanently codes for resources/URLs that are totally valid. Thus, a large part of diagnosing the issue will be going through the process of double-checking what resources/URLs are generating
301 Moved Permanently response codes and determining if these codes are appropriate or not.
That said, if your application is responding with
301 Moved Permanently codes that it should not be issuing, this is an issue that many other visitors may be experiencing as well, dramatically hindering your application’s ability to service users. We’ll go over some troubleshooting tips and tricks to help you try to resolve this issue. If nothing here works, don’t forget that Google is your friend. Don’t be afraid to search for specific terms related to your issue, such as the name of your application’s CMS or web server software, along with
301 Moved Permanently. Chances are you’ll find others who have experienced this issue and have come across a solution.
Troubleshooting on the Server-Side
Here are some additional tips to help you troubleshoot what might be causing the
301 Moved Permanently to appear on the server-side of things:
Check the Server Configuration Files– Your application is likely running on a server that is using one of the two most popular web server softwares,
nginx. At the time of publication, both of these web servers make up
over 84%of the world’s web server software! Thus, one of the first steps you can take to determine what might be causing these
301 Moved Permanentlyresponse codes is to check the configuration files for your web server software for unintentional redirect instructions.
To determine which web server your application is using you’ll want to look for a key file. If your web server is Apache then look for an
.htaccess file within the root directory of your website file system. For example, if your application is on a shared host you’ll likely have a username associated with the account on that host. In such a case, the application root directory is likely something like
/home/<username>/public_html/, so the
.htaccess file would be at
If you located the
.htaccess file then open it in a text editor and look for lines that use
RewriteXXX directives, which are part of the
mod_rewrite module in Apache. Covering exactly how these rules work is well beyond the scope of this article, however, the basic concept is that a
RewriteCond directive defines a text-based pattern that will be matched against entered URLs. If a matching URL is requested by a visitor to the site, the
RewriteRule directive that follows one or more
RewriteCond directives is used to perform the actual redirection of the request to the appropriate URL. Therefore, if you find any strange
RewriteRule directives in the
.htaccess file that don’t seem to belong, try temporarily commenting them out (using the
# character prefix) and restarting your web server to see if this resolves the issue.
On the other hand, if your server is running on
nginx, you’ll need to look for a completely different configuration file. By default this file is named
nginx.conf and is located in one of a few common directories:
/usr/local/etc/nginx. Once located, open
nginx.conf in a text editor and look for the
rewrite directives. For example, here is a simple
block directive (i.e. a named set of directives) that configures a virtual server by creating a redirection from
invalid-domain.com to the proper
Rewrite directives in
nginx are similar to the
RewriteRule directives found in
Apache, as they tend to contain more complex text-based patterns for searching. Either way, look through your
nginx.conf file for any abnormal
rewrite directives and comment them out before restarting the server to see if the issue was resolved.
Check the Logs– Nearly every web application will keep some form of server-side logs.
Application logsare typically the history of what the application did, such as which pages were requested, which servers it connected to, which database results it provides, and so forth.
Server logsare related to the actual hardware that is running the application, and will often provide details about the health and status of all connected services, or even just the server itself. Google “logs [PLATFORM_NAME]” if you’re using a CMS, or “logs [PROGRAMMING_LANGUAGE]” and “logs [OPERATING_SYSTEM]” if you’re running a custom application, to get more information on finding the logs in question.
Application Code or Script Bugs– If all else fails, it may be that a problem in some custom code within your application is causing the issue. Try to diagnose where the issue may be coming from through manually debugging your application, along with parsing through application and server logs. Ideally, make a copy of the entire application to a local development machine and perform a step-by-step debug process, which will allow you to recreate the exact scenario in which the
301 Moved Permanentlyoccurred and view the application code at the moment something goes wrong.
No matter what the cause, the appearance of a
301 Moved Permanently within your own web application is a strong indication that you may need an error management tool to help you automatically detect such errors in the future. The best of these tools can even alert you and your team immediately when an error occurs. Airbrake’s error monitoring software provides real-time error monitoring and automatic exception reporting for all your development projects. Airbrake’s state of the art web dashboard ensures you receive round-the-clock status updates on your application’s health and error rates. No matter what you’re working on, Airbrake easily integrates with all the most popular languages and frameworks. Plus, Airbrake makes it easy to customize exception parameters, while giving you complete control of the active error filter system, so you only gather the errors that matter most.
Check out Airbrake’s error monitoring software today and see for yourself why so many of the world’s best engineering teams use Airbrake to revolutionize their exception handling practices!
Table of Contents
- Heading information
- Apache dummy requests
Table of Contents
- Heading information
- Apache dummy requests
Valid for versions 82 through the latest version
Last modified: June 15, 2020
Apache is a web server daemon (
httpd). It responds to HTTP requests, and subsequently serves web pages. For example, if one of your visitors requests your domain,
www.example.com, from a web browser, Apache serves the index page for
mod_statusApache module, which this interface uses. When you install LiteSpeed Web Server, this interface will recommend that you use the LiteSpeed Web Console interface to check the server’s status. Also, the system will report
file not founderrors in the Apache log file.
This interface displays the following heading information:
- Server Version — The version of Apache that runs on the server.
- Server Built — The time and date at which you installed Apache.
- Current Time — The current time and date.
- Restart Time — The time and date at which you last restarted the server.
- Parent Server Generation — The number of times that you have restarted Apache gracefully, which causes it to re-read its configuration file. This occurs, for example, whenever you add domains to your server.
- Server uptime — The amount of time over which the server has run.
- Total accesses — The total number of requests for your server.
- Total Traffic — The total amount of traffic for your server, in megabytes (MB).
- CPU Usage — The total CPU usage and current load percentage (the percentage of the server’s currently-used processing power). Under the CPU usage, the interface displays the following additional information:
- The number of requests per second, bytes per second, and kilobytes per request that the server transfers.
- The number of Apache sub-servers (workers or children) that serve requests.
- The number of idle workers.
Apache Http Status 500
The Scoreboard section displays the following information about each worker on your server:
- Srv — The worker’s server number.
- PID — The operating system’s process ID number.
- Acc — The number of requests that this worker has served for this connection, this child, and this slot, separated by forward slashes (
/). For example, 0/2055/7670 indicates the following request data:
- 0 requests for this connection.
- 2055 requests for this child.
- 7670 requests for this slot.
- M — The mode of operation. This column displays the following modes:
- _ — The server is waiting for the connection.
- S — The server is starting.
- R — The server is reading the request.
- W — The server is sending a reply.
- K — The server is in keep alive (read) mode.
- D — The server received a DNS request.
- C — The server is closing the connection.
- I — Idle worker cleanup.
- . — Idle worker.
- CPU — The worker’s CPU usage.
- SS — The number of seconds since the start of the most recent request.
- Req — The amount of time that the worker required to process the most recent request, in milliseconds.
- Conn — The amount of information that the worker transferred to the visitor, in kilobytes (KB).
- Child — The total amount of information that the worker transferred, in kilobytes (KB).
- Slot — The total amount of information that the slot transferred, in megabytes (MB).
- Client — The IP address of the user who requested the data.
- VHost — The domain name of the server that requested the data.
- Request — The type of request that the server received.
- GET — indicates that Apache downloaded data.
- POST — indicates that Apache sent information to the server.
Apache dummy requests
Apache uses dummy requests to wake processes that listen for new connections. A dummy request is an HTTP request that Apache sends to itself. These requests, when Apache uses them without SSL, appear in access log files with the remote address set to the local host (
127.0.0.1 for IPv4 or
::1 for IPv6). These dummy requests are a normal part of Apache’s functionality, which you can safely ignore.
Apache’s dummy requests cannot use SSL. It is possible that servers with hosts that use SSL can receive noise in the log file that resembles the following:
On a lightly loaded server, this interface frequently shows a high number of dummy connections. This occurs because the feature displays the last request to a worker slot, which is typically a dummy request.
Linux Apache Status
It may also appear that Apache currently handles a high number of
OPTIONS requests when in fact the workers are simply idle.