I need help replacing a word in an apache Vhost's file using Puppet. My Vhost file looks like:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
Now I want to substitute the * with the $fqdn facter variable on the first line. I don't want to use the apache module from Puppet Forge. I found file_line from the stdlib module but it is not able to substitute with a facter variable.
I could use the exec resource type which will run a sed command to replace * with the hostname, but I want to avoid doing that. Is there any other way to do this?
You can in fact use file_line here:
include stdlib
$fqdn = $facts['fqdn']
file_line { 'virtual_host':
ensure => present,
path => '/path/to/httpd.conf',
line => "<VirtualHost ${fqdn}:80>",
match => '<VirtualHost \*:80>',
}
Ok, so I found my answer:
append_on_no_match => false,
Added that to the match statement; seems to prevent appending if no match is found.
The problem with this answer, is that if puppet doesn't match a string it still appends, and this cannot always happen, in fact, it often cannot happen.
I don't have an answer, but perhaps someone else might. I would prefer a puppet answer vs me writing a script (with sed or perl).
Sincerely,
Some puppet user....
Related
I have a http server (apache HTTPD v2.4) where directory listing is enabled. I configured it to use the 'fancy-index' from https://github.com/Vestride/fancy-index, and works great. However, its searching function didn't give what I was looking for.
I'd like to configure the webserver such that if I goto http://mywebserver.com/someDir/*?list, it will return a list of all the files in someDir in a "file, filesize" format.
Or, if I goto http://mywebserver.com/someDir/essay2020*.txt?list , I'll get a custom list of all essay2020*.txt files. Or some form of a simple regex: say "essay2020[0-2]*.txt".
I can write a php/perl/python script that can read a directory and return the 'file, filesize' list. But how do I configure the .htaccess to call this script? Do I have to muck around with 'RewriteRule'? or something special?
As an added note, I'm not limited to modifying .htaccess only. If I can do all of this by modifying the httpd.conf, I'm open to that suggestion too.
Thanks.
The answer in Comments by CBroe did it. By just modifying the apache2.conf file to add:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^list$
RewriteRule .* /search.php?path=%{REQUEST_URI}
within my <VirtualHost>, I'm now able to forward everything to search.php, where there I can parse and do what needs to be done. All w/o revealing search.php's existence. Thanks.
Sorry if this is a duplicate: I found many questions about caching system, but my problem seems to tied to the fact that the whole script is working within a subfolder.
All I need to do is implementing a simple caching system for my website, but I can't get this to work.
Here's my .htaccess file (widely commented to be clear - sorry if too many comments are confusing):
RewriteEngine on
# Map for lower-case conversion of some case-insensitive arguments:
RewriteMap lc int:tolower
# The script lives into this subfolder:
RewriteBase /mydir/
# IMAGES
# Checks if cached version exists...
RewriteCond cache/$1-$2-$3-{lc:$4}.$5 -f
# ...if yes, redirects to cached version...
RewriteRule ^(hello|world)\/image\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_\s]+)\.(png|gif|jpeg?|jpg)$ cache/$1-$2-$3-{lc:$4}.$5 [L]
# ...if no, tries to generate content dynamically.
RewriteRule ^(hello|world)\/image\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_\s]+)\.(png|gif|jpeg?|jpg)$ index.php?look=$1&action=image&size=$2&data=$3&name=$4&format=$5 [L,QSA]
# OTHER
# This is always non-cached.
RewriteRule ^(hello|world)\/([a-zA-Z0-9\.\-_\s]+)\/([a-zA-Z0-9\.\-_\s]+)?\/?$ index.php?look=$1&action=$2&name=$3 [QSA]
Now, the issue is that the RewriteCond seems to be always failing, as the served image is always generated by PHP. I also tried prepending a %{DOCUMENT_ROOT}, but is still not working. If I move the whole script to the root directory, it magically starts working.
What am I doing wrong?
Well one thing that you are doing wrong is trying to use a rewrite map in an .htaccess file. in the first place. According to the Apache documentation:
The RewriteMap directive may not be used in <Directory> sections or .htaccess files. You must declare the map in server or virtualhost context. You may use the map, once created, in your RewriteRule and RewriteCond directives in those scopes. You just can't declare it in those scopes.
If your ISP / sysadmin has already defined the lc map then you can use it. If not then you can only do case-sensitive file caching on Linux, because its FS naming is case sensitive. However, since these are internally generated images, just drop the case conversion and stick to lower case.
%{DOCUMENT_ROOT} may not be set correctly at time of mod_rewrite execution on some shared hosting configurations. See my Tips for debugging .htaccess rewrite rules for more hints. Also here is the equivalent lines from my blog's .htaccess FYI. The DR variable does work here, but didn't for my previous ISP, to I had to hard-code the parth
# For HTML cacheable blog URIs (a GET to a specific list, with no query params,
# guest user and the HTML cache file exists) then use it instead of executing PHP
RewriteCond %{HTTP_COOKIE} !blog_user
RewriteCond %{REQUEST_METHOD}%{QUERY_STRING} =GET [NC]
RewriteCond %{DOCUMENT_ROOT}html_cache/$1.html -f
RewriteRule ^(article-\d+|index|sitemap.xml|search-\w+|rss-[0-9a-z]*)$ \
html_cache/$1.html [L,E=END:1]
Note that I bypass the cache if the user is logged on or for posts and if any query parameters are set.
Footnote
Your match patterns are complicated because you are not using the syntax of regexps: use the \w and you don't need to escape . in [ ] or / . Also the jpeg isn't right is it? So why not:
RewriteRule ^(hello|world)/image/([.\w\-]+)/([.\w\-]+)/([\w\-]+\.(png|gif|jpe?g))$ \
cache/$1-$2-$3-$4 [L]
etc.. Or even (given that the file rule will only match for valid files in the cache)
RewriteRule ^(hello|world)/image/(.+?)/(.+?)/(.*?\.(png|gif|jpe?g))$ \
cache/$1-$2-$3-$4 [L]
The non-greedy modifier means that (.+?) is the same as ([^/]+) so doing hacks like ../../../../etc/passwd won't walk the file hierarchy.
I set variable in .htaccess like this
SetEnv clubhub_path clubhub-ui
And I can acces it in php with
$_SERVER['clubhub_path];
But I wanted to use it in .htaccess in Rewrite Cond
RewriteCond %{REQUEST_URI} ^(?!/%{SERVER:clubhub_path}/media/).+ [NC]
I found somewhere this(%{SERVER:clubhub_path}) should work but it doesn't. I tried all the combinations with {}, %, $. No success...
Cheers
SetEnv sets environment variables, so it should be available in %{ENV:clubhub_path} but i've tried that and doesn't seem to be working.
However since you can set environment variables with RewriteRules you could write it like this:
RewriteRule ^ - [E=clubhub_path:clubhub-ui]
This rule matches every url, but doesn't rewrite it to anyting just sets an environment variable that will be available in RewriteConds like:
RewriteCond %{ENV:clubhub_path} ^clubhub-ui$
This should look like exactly the same once it gets to php. (in $_SERVER superglobal, or getenv())
Update
However you still can't use your %{ENV:variable} in the right hand side of RewriteCond. I think the only way to do this if you are on apache 2.4 and you can use ap_expr
RewriteCond expr "! '%{REQUEST_URI}' -strcmatch '/%{ENV:clubhub_path}/media/*'"
In my test environment this seem to be doing what you want (negative match on the '/clubhub-ui/media' urls, but apache2.4 is still pretty new, you probably can't have it installed if you are not self-hosted.
Maybe RewriteMap with a prg parameter and a script could implement your idea.
I have a problem in rewriting my dynamic url pattern in localhost.
here is my url: http://localhost/realtor/?module=property&action=popular-residential-buy
and i want the url to be http://localhost/realtor/property/popular-residential-buy
I have done so far in my .htaccess file:
Options +FollowSymLinks
RewriteEngine on
RewriteRule type (.*)-(.*)$ /?module=$1&action=$2
but it's not working.
Your existing regular expression gobbles up too much of your URL. You'll end up with something other than what you want in $1 and $2 (probably realtor/property/popular-residential in $1, and just buy in $2, due to the first .* greedily matching as much as it can before back tracking one character at a time to find a match).
Based on the URL you provided, it looks like your regular expression should be something like ^realtor/([^/]*)/([^/]*)/?$. That will give you what you want in $1 and $2, and it should be a quicker regular expression AFAIK.
Past that, make sure that you do have the RewriteEngine properly configured on your particular server.
For Apache, you'll need to enable mod_rewrite. Look in your httpd.conf for LoadModule rewrite_module modules/mod_rewrite.so, and make sure it is uncommented.
IIS is a bigger can of worms -- let me know if that is what you are using, and I will write a more complete answer.
I've got a directory called fb and a script inside called like.php. I'd like to have the get-id passed to the like-file using mod_rewrite.
mypage.com/fb/like.php?id=5 would be mypage.com/fb/like/5
My (not working) htaccess looks like this:
RewriteEngine on
RewriteRule /fb/like/([0-9]+) /fb/like.php?id=$1
Does anyone see what's wrong here?
Try removing the slash at the beginning of your match and replace patterns like so:
RewriteRule fb/like/([0-9]+) fb/like.php?id=$1
mypage.com/ is the domain name, so the string that gets matched is fb/like/5
Also consider using the carat at the start of your match string so that it will match fb but not fffb:
RewriteRule ^fb/like/([0-9]+) fb/like.php?id=$1
Here's a short guide to mod_rewrite I've found helpful.
Edit for your follow-up question:
To match mypage.com/something/fb/like/5, you can do this:
RewriteRule ^([^/]+)/fb/like/([0-9]+) $1/fb/like.php?id=$2
This saves the first directory as $1. [^/]+ means match one or more characters that are not a slash. Put this .htaccess file in the root directory of your domain.
Alternatively, you can use the second-to-last rule and put that .htaccess file in the "something" subdirectory. Hope that makes sense.
Or you can write a rule to match simply like.php/([0-9]+) so that it'll work no matter what the directory path looks like. You can go even more generic and make this apply to any PHP file, not just like.php. It really depends on how you want your site to work.