Aliasing gitweb css in apache2? - apache

On an Ubuntu Server 14.04, I have
$ apt-show-versions apache2
apache2:amd64/trusty-updates 2.4.7-1ubuntu4.9 uptodate
Here, I installed gitweb, and tried to set it up. Eventually, I managed to get it working by adding the following to my /etc/apache2/sites-available/default-ssl.conf site:
###############
ScriptAlias /gitweb/ "/usr/share/gitweb/"
Alias /gitweb /usr/share/gitweb
Alias /gitweb/static/gitweb.css /usr/share/gitweb/static/gitweb.css
<Directory "/usr/share/gitweb">
Options Indexes FollowSymlinks ExecCGI
AddHandler cgi-script .cgi
#DirectoryIndex gitweb.cgi # does not do anything?
AllowOverride None
Order allow,deny
Allow from all
</Directory>
###############
Now, when I call https://example.com/gitweb/gitweb.cgi, I do get the gitweb home page, listing my repos. The problem is, the .css, .js, etc files are not loaded. When looking at the source of the served HTML of gitweb.cgi, I can see:
<link rel="stylesheet" type="text/css" href="static/gitweb.css"/>
...
<script type="text/javascript" src="static/gitweb.js"></script>
... and since these are called from under gitweb, their full adresses are https://example.com/gitweb/static/gitweb.css; and for them in the Firefox Javascript console:
GET https://example.com/gitweb/static/gitweb.css [HTTP/1.1 500 Internal Server Error 72ms]
... or if I call those URLs directly in Firefox, I get:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
...
More information about this error may be available in the server error log.
... unfortunately, there is nothing in the error logs, because I am doing:
grep -r gitweb.css /var/log/apache2
... and absolutely nothing is returned.
So, even if I'm trying an alias:
Alias /gitweb/static/gitweb.css /usr/share/gitweb/static/gitweb.css
... it doesn't work; and I've also tried:
Alias /static/gitweb.css /usr/share/gitweb/static/gitweb.css
Alias static/gitweb.css /usr/share/gitweb/static/gitweb.css
Alias /gitweb.css /usr/share/gitweb/static/gitweb.css
... and none of this works.
So, how can I get Apache set up, so that when a request comes in for /gitweb/static/gitweb.css (in terms of web root), then it serves /usr/share/gitweb/static/gitweb.css?

Well, found something by brute force - as I still couldn't find where this errors are logged.
Anyways, the ScriptAlias directive, on its own, is enough to cause 500 Internal Server Error upon a call to https://example.com/gitweb/static/gitweb.css.
On the other hand, the Alias /gitweb /usr/share/gitweb directive is, on its own, enough to make https://example.com/gitweb/static/gitweb.css find and serve the right file.
So, it turns out, if ScriptAlias is the first one in the code, and Alias is the second, we'll get 500 Internal Server Error regardless.
But if the order is changed, so Alias is first, and ScriptAlias second - then all seems to work fine.
So ultimately, the working code for the OP example I ended up using is:
###############
Alias /gitweb /usr/share/gitweb
ScriptAlias /gitweb/ "/usr/share/gitweb/"
##Alias /gitweb/static/gitweb.css /usr/share/gitweb/static/gitweb.css
<Directory "/usr/share/gitweb">
Options Indexes FollowSymlinks ExecCGI
AddHandler cgi-script .cgi
#DirectoryIndex gitweb.cgi # does not do anything?
AllowOverride None
Order allow,deny
Allow from all
</Directory>
###############

Related

Refreshing an Added Alias Directory to Apache's HTTPD

I'm exposing files using Apache's httpd <Directory> as below
Alias /getfiles "/web/playbooks/tmpfiles"
<Directory "/web/playbooks/tmpfiles">
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>
With this I'm able to access all files/folder inside /web/playbooks/tmpfiles through web browser URL like the below.
http://<server>:<port>/getfiles/<anyfile.txt>
Is it possible to refresh the above URL so I could see latest changes to files/folder inside /web/playbooks/tmpfiles periodically?
Any solution would be great.
You could try to make the client autorefresh by itself through instructions in the html itself instead of trying to do something weird which is not probably in the http spec. (I might be wrong).
For example, according to your directory entry, load module_autoindex module and then use this config:
<Directory /web/playbooks/tmpfiles>
Options Indexes MultiViews
IndexOptions FancyIndexing
IndexHeadInsert "<meta http-equiv=\"refresh\" content=\"10\">"
AllowOverride None
Require all granted
</Directory>
This way Apache httpd will add that tag in the html and the client will know it has to autorefresh the page each 10 seconds. Generally it is not recommended to set this too low, so perhaps 10 seconds and above is alright for you.

How to Run perl script through URL in Ubuntu

I would like to run perl as CGI . i.e Want to run it in localhost rather than command prompt.
I have installed perl . I have kept my file at /var/www/cgi-bin/
and i have made following changes in /etc/apache2/apche2.conf
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory /var/www/cgi-bin/>
Options ExecCGI
AddHandler cgi-script cgi pl
</Directory>
Its giving me 404 not found error.
Following is the url I am accessing:
http://localhost/cgi-bin/testscript.pl
If your file is at /var/www/cgi-bin/, and your configuration says:
ScriptAlias /cgi-bin/ /home/www/cgi-bin/
Then I'd say that the problem is pretty obvious. /var/www/cgi-bin/ and /home/www/cgi-bin/ are not the same directory.
Update: Ok. So you say that you have fixed the value of ScriptAlias and it still didn't work. Assuming that you're still getting the 404 error, then the next obvious step is to look in your error log and see exactly which file Apache is looking for. There's probably a mismatch between how Apache is configures to map between URLs and files and how you think it is configured.
When you get that error message, add it to your question.

How to Set AllowOverride all

I want to set the AllowOverride all But I don't know how to do it. I have found the following code by searching the google and pasted it in .htaccess:
<Directory>
AllowOverride All
</Directory>
But after pasting it I started receiving "Internal Server Error"
Can anyone guide me where to put this code or how to do it?
In case you are on Ubuntu, edit the file /etc/apache2/apache2.conf (here we have an example of /var/www):
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
and change it to;
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
then,
sudo service apache2 restart
You may need to also do sudo a2enmod rewrite to enable module rewrite.
The main goal of AllowOverride is for the manager of main configuration files of apache (the one found in /etc/apache2/ mainly) to decide which part of the configuration may be dynamically altered on a per-path basis by applications.
If you are not the administrator of the server, you depend on the AllowOverride Level that theses admins allows for you. So that they can prevent you to alter some important security settings;
If you are the master apache configuration manager you should always use AllowOverride None and transfer all google_based example you find, based on .htaccess files to Directory sections on the main configuration files. As a .htaccess content for a .htaccess file in /my/path/to/a/directory is the same as a <Directory /my/path/to/a/directory> instruction, except that the .htaccess dynamic per-HTTP-request configuration alteration is something slowing down your web server. Always prefer a static configuration without .htaccess checks (and you will also avoid security attacks by .htaccess alterations).
By the way in your example you use <Directory> and this will always be wrong, Directory instructions are always containing a path, like <Directory /> or <Directory C:> or <Directory /my/path/to/a/directory>. And of course this cannot be put in a .htaccess as a .htaccess is like a Directory instruction but in a file present in this directory. Of course you cannot alter AllowOverride in a .htaccess as this instruction is managing the security level of .htaccess files.
Goto your_severpath/apache_ver/conf/
Open the file httpd.conf in Notepad.
Find this line:
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
Remove the hash symbol:
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Then goto <Directory />
and change to:
<Directory />
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
Then restart your local server.
On Linux, in order to relax access to the document root, you should edit the following file:
/etc/httpd/conf/httpd.conf
And depending on what directory level you want to relax access to, you have to change the directive
AllowOverride None
to
AllowOverride All
So, assuming you want to allow access to files on the /var/www/html directory, you should change the following lines from:
<Directory "/var/www/html">
AllowOverride None
</Directory>
to
<Directory "/var/www/html">
AllowOverride All
</Directory>
If you are using Linux you may edit the code in the directory of
/etc/httpd/conf/httpd.conf
now, here find the code line kinda like
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
</Directory>
Change the AllowOveride None to AllowOveride All
Now now you can set any kind of rule in your .httacess file inside your directories
if any other operating system just try to find the file of httpd.conf and edit it.
As other users explained here about the usage of allowoveride directive, which is used to give permission to .htaccess usage. one thing I want to point out that never use allowoverride all if other users have access to write .htaccess instead use allowoveride as to permit certain modules.
Such as AllowOverride AuthConfig mod_rewrite Instead of
AllowOverride All
Because module like mod_mime can render your server side files as plain text.
enter code hereif you are using linux you have to edit the
`/etc/apache2/sites-available/000-default.conf`
under the Documentroot . add the following code
`<Directory /var/www/>
AllowOverride all
Require all granted
</Directory>`
then ,
`sudo service apache2 restart`
and you have to enable the apache mod rewrite
`sudo a2enmod rewrite`
I think you want to set it in your httpd.conf file instead of the .htaccess file.
I am not sure what OS you use, but this link for Ubuntu might give you some pointers on what to do.
https://help.ubuntu.com/community/EnablingUseOfApacheHtaccessFiles
I also meet this problem, and I found the solution as 2 step below:
1. In sites-enabled folder of apache2, you edit in Directory element by set "AllowOverride all" (should be "all" not "none")
2. In kohana project in www folder, rename "example.htaccess" to ".htaccess"
I did it on ubuntu. Hope that it will help you.
There are several answers but there a number of things wrong with this question and I would like to address these:
If you get an error (e.g. 500), look in the log files (if you have access to them). e.g. /var/log/apache2/ssl_error.log
e.g.
cat /var/log/apache2/ssl_error.log
[Tue Jun 01 19:05:34 2021] [alert] [pid 31154] config.c(2119):
[client *******] /var/www/mysite/public/tmp/.htaccess:
<Directory not allowed here [lid YLZo3quRlv2EKOAABVoFLwAAAIM]
Putting AllowOverrides in a .htaccess makes no sense and is not allowed. See Context. See also my explanation below. It should be defined in the Apache configuration (e.g. /etc/apache2)
Allowing everything is usually not the best idea. Be as restrictive as possible!
the Directory directive is missing a directory, should be e.g. <Directory /var/www/html/etc>
the Directory directive does not make sense in an .htaccess. The location of the .htaccess in a directory already has the effect of making the statements within apply to a specific directory
do not mix and match snippets that are intended to be put in the Apache configuration (e.g. in /etc/apache2/...) with statements that are intended to be put in .htaccess - though most of the time, they will be identical, there are some subtle differences
If you have the possibility to modify the Apache configuration directly, do not use .htaccess and deactivate it. (for performance reasons, among others. Also you can have all configuration in one place, put it in version control or manage it via a software configuration management tool, e.g. Puppet, Ansible, SaltStack)
Unless you really cannot access and modify the Apache configuration directly, you do not need .htaccess. This is a common misconception.
That you saw a 500 error proves my point. If you change configuration in the Apache configuration directly (and not in .htaccess), you will usually get an error message with an explanation and information about the error and the line number (e.g. when you do service apache2 reload or apachectl configtest) - which gives you the possibility to fix the error before applying this in production(!).
Also, look in the documentation. It is really quite good. For most directives, you can find where they apply (see "Context").
For example, for IfModule, you can see:
Context: server config, virtual host, directory, .htaccess
For, AllowOverrides it is:
Context: directory
Note the missing .htaccess in the Context!
Instead of googling for information which repeat the same mistakes over and over, look in the documentation!
Docs
AllowOverrides
https://www.danielmorell.com/guides/htaccess-seo/basics/dont-use-htaccess-unless-you-must
SuSE Linux Enterprise Server
Make sure you are editing the right file
https://www.suse.com/documentation/sles11/book_sle_admin/data/sec_apache2_configuration.html
httpd.conf
The main Apache server configuration file. Avoid changing this file. It primarily contains include statements and global settings. Overwrite global settings in the pertinent configuration files listed here. Change host-specific settings (such as document root) in your virtual host configuration.
In such case vhosts.d/*.conf must be edited
Plus those upvoted correct answers sometimes same error could be seen because of mismatched and different settings on SSL part of webserver configurations. (Obviously when not using .htaccess file).

Easyphp development environment aliases not working

I use Easyphp for my development environment on my Windows PC and Laptop. For some odd reason I am unable to get aliasing to work on my laptop. I get an error:
Object not found!
I think it is a problem with Apache, but I am unsure. It is probably something dead simple, but I have spent way to many hours trying to work it out for myself. I have tried to manually write the alias and I have tried reinstalling easyphp, but I can't get it to work. Could the default virtual host be interfering with the alias?
Here is what is at the bottom of the httpd.conf file:
# == !!! DO NOT REMOVE !!! ===================================================
### Alias EasyPHP
# ============================================================================
#alias
Alias "/development" "C:/Users/Sam/dev"
<Directory "C:/Users/Sam/dev">
Options FollowSymLinks Indexes
AllowOverride All
Order deny,allow
Allow from 127.0.0.1
Deny from all
Require all granted
</Directory>
#alias
# ============================================================================
### Alias End
# ============================================================================
# == !!! DO NOT REMOVE !!! ===================================================
### VirtualHost EasyPHP
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
DocumentRoot "C:/Program Files (x86)/EasyPHP-12.1/www"
ServerName localhost
</VirtualHost>
# ============================================================================
#virtualhost
#virtualhost
# ============================================================================
### VirtualHost End
# ============================================================================
#Sam: I'm no guru, but have just solved this for myself and thought I'd share my experience. I have happily used EasyPHP 12.1 for several weeks, adding and deleting aliases through testing various WordPress setups. Suddenly, aliases I added threw up the "Object not found" error, no matter how I addressed them. I checked my httpd.conf file and found the recently added aliases were not present (?). Manually adding the ones I needed (and deleting the obsolete ones) solved it for me.
Note: my httpd.conf file ends with my last alias, and not with a "virtualhost" entry:
...
Alias "/mangala" "C:/_localwebs/mangala"
<Directory "C:/_localwebs/mangala">
Options FollowSymLinks Indexes
AllowOverride All
Order deny,allow
Allow from 127.0.0.1
Deny from all
Require all granted
</Directory>
Alias "/zenphoto" "C:/_localwebs/zenphoto"
<Directory "C:/_localwebs/zenphoto">
Options FollowSymLinks Indexes
AllowOverride All
Order deny,allow
Allow from 127.0.0.1
Deny from all
Require all granted
</Directory>
#alias
# ========================
# ========================
Hope you've either sorted it already, or this helps.
You should check to see if you have Apache and mysql started as a service, becuase I had this problem and Apache being started as a service is what was the problem for me.

Using Mercurial and Apache

I'm using Mercurial 1.7 and Apache 2.2.3. I'm trying to use the hgwebdir.cgi script to authenticate and serve my repositories, which are located at /var/lib/mercurial-server/repos.
Although the authentication works, the webpage does not show any of the repositories.
This is my /var/www/cgi-hg/hgwebdir.cgi:
config = "/var/lib/mercurial-server/repos/"
import sys; sys.path.insert(0, "/usr/lib64/python2.4/")
import cgitb; cgitb.enable()
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)
This is my /var/www/cgi-hg/hgwebdir.config:
[collections]
/var/lib/mercurial-server/repos=/var/lib/mercurial-server/repos
[web]
allow_push = *
style = gitweb
push_ssl = False
This is my /etc/httpd/conf/httpd.conf (parts where changes were made):
DocumentRoot "/var/www/cgi-hg"
<Directory />
Options ExecCGI FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-hg">
Options ExecCGI Indexes FollowSymLinks
AllowOverride None
</Directory>
DirectoryIndes index.html index.html.var hgwebdir.cgi
ScriptAlias /hg "/var/www/cgi-hg/hgwebdir.cgi"
<Location /hg>
AuthType Basic
AuthName "Login Required"
AuthUserFile /usr/local/etc/users
Require valid-user
</Location>
Using config = "/var/lib/mercurial-server/repos/" and config = "/var/hg/hgwebdir.config" in hgwebdir.cgi gives me the empty repository page. Even though there is NO hgwebdir.config in /var/hg/.
Using config = "/var/www/cgi-hg/hgwebdir.config" gives me a page showing OSError. Part of the page shows:
/var/www/cgi-hg/hgwebdir.cgi
(highlighted) 22 application = hgweb(config)
application undefined, hgweb = <function hgweb>, config = '/var/www/cgi-hg/hgwebdir.config'
/usr/lib64/python2.4/site-packages/mercurial/hgweb/__init__.py in hgweb(config='/var/www/cgi-hg/hgwebdir.config', name=None, baseui=None)
(highlighted) 26 return hgwebdir_mod.hgwebdir(config, baseui=baseui)
...
I also noticed that whenever I restart my httpd, I get the 2 messages:
Starting httpd: [date time] [warn] The ScriptAlias directive in /etc/httpd/conf/httpd.conf at line 570 will probably never match because it overlaps an earlier ScriptAliasMatch.
httpd: Could not reliably determine the server's fully qualified domain name, using <IP address> for ServerName
There is no ScriptAliasMatch in my httpd.conf.
When I point my browser to /hg, I'm asked to authenticate, then I either get the empty repository page, or the Python errors, depending on which config I use in the hgwebdir.cgi.
If I use "hg serve --webdir-conf /var/www/cgi-hg/hgwebdir.config", all my repositories show up correctly.
I'm very new to apache, so I'm sure I've gotten something wrong. Please advise.
Thank you.
I don't know about the ScriptAlias warning, but I think line of your /var/www/cgi-hg/hgwebdir.cgi file should be changed from the current:
config = "/var/lib/mercurial-server/repos/"
to
config = "/var/www/cgi-hg/hgwebdir.config"
When you're serving a single repo it's the path to that repo, and when you're serving multiple files it's the path to the hgweb configuration file.
You can make sure that it's reading your hgwebdir.config file by changing the style to something very noticable like coal (which is dark gray). If you don't see that change then it's just running with defaults.
Once you get things going you should lock down that Apache config a bit too. One's DocumentRoot is usually soemthing other than the directory containing the CGIs (you don't want people trolling around the areas outside of /hg) and similarly you shouldn't have ExecCGI option enabled for the whole files system (Directory /) as a general rule.
First, though, make sure it's actually reading your hgwebdir.config file and then work on that.