.html causes 404 error - php

I am running a joomla 2.5 site on ubuntu server with php/nginx/mysql (fairly new to nginx)
My problem is that when a user hits a url, I need it to ignore the .html file extension.
For example, if you hit mysite.com/page then it renders the page fine.
If you hit mysite.com/page.html then it will throw a 404 error. Which is because there isn't actually a 'page.html' page on my site. Its a K2 article alias. Yes, I could not put .html in but its not me adding content to the site, its the client. I have recently moved server and before it worked fine, now it doesnt so I know I have missed something in the config.
I know I can get nginx to do the opposite of what I want, with try files. Not sure how to get it to do the reverse.
This is my nginx config:
location / {
# First attempt to serve request as file, then
# as directory, then fall back to index.html
try_files $uri $uri/ /index.php;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
Now I know if i had a page.html page and I wanted to hide the .html I could add $uri.html
What I want to know is how to get nginx to try page.html if it cant find it try page

So turned out to be a Joomla Config variable. Under SEO settings in global config set 'apply suffix' to yes. I feel quite stupid. Thanks to all those that tried to help, as always much appreciated.

Here's a potential solution I managed to come across:
location / {
# If /{foo} is not an existing file or directory, rewrite to /{foo}.html
if (!-e $request_filename) {
rewrite ^(.+)$ /$1.html break;
}
# Redirect all {foo}.html URLS to /{foo}
rewrite ^/(.*)\.html$ /$1 redirect;
}
If you can correctly write .htaccess rewrite lines, try using a htaccess-to-nginx converter
As commented, this will check for the existence of a directory, file, etc. using the current URL. If nothing exists, it will attempt to request the url with .html appended.
Additionally, if .html is already present in the URL, it will redirect to the URL without .html

Quick workaround:
rewrite ^(. *)\.html$ $1 break;
Should be the first rewrite in the stack, even before try_files.

Related

Converting Rewrites from Apache to NGINX

I have a custom PHP application which follows the basic MVC pattern of development. The applications directory structure is as follows:
admin/
default/
index.php
In the admin is another index.php (which is how it handles requests to /admin).
In apache, this worked by putting a .htaccess file in each directory (admin and doc root) setting up a rewite and the application works. In NGINX, it doesnt seem so simple.
I can get the basic "default" application to work, by using this in my nginx.conf:
if (!-e $request_filename)
{
rewrite ^(.+)$ /index.php?path=$1 last;
}
(we run on vhosts so I cannot reference location / or I get a duplicate rule error).
This gets the frontend application to work, but when I try to access the /admin portion of the application the login screen loads, but when I try to submit and it tries to hit the endpoint 'admin/index/index' it fails, as my rewrite rule doesnt work. Here is what I have for the rewrite in NGINX:
location /admin {
try_files $uri $uri/ /admin/index.php?path=$uri&$args;
}
I think the issue is that the $uri being passed in is /admin/index/index instead of it being what it should be and is under Apache: /index/index.
Can anyone help me correct these NGINX rules so that my application works properly?
Thanks in advance.
As you said, you pass in the extra $uri. Try this:
location /admin {
try_files $uri $uri/ /admin/index.php?$args;
}

Lumen application work with trailing slash using Nginx server

all I am new to Lumen cause I was using something else before. I have tested Lumen project and find out that it works well with nice support and documentation and can be extend to Laravel which is a bigger project. So I decide to use Lumen for a company,
The only problem I am currently facing now is trailing slash of url on Nginx.
e.g.
$app->get('welcome', function() { return 'Hello'; });
it responds to
http://mysite.dev/welcome
but with a trailing slash
http://mysite.dev/welcome/
the site throws a 404.
This is because the old website been using all url with end slash for e.g. PPC, SEO ... more, They do not want to redo and change the whole process including 3rd party who use these url and they can not do 301 from url with ending / to redirect to url without ending / which will cause too much redirection.
I have tried searching for solution for whole week now but still can not find any solution that best match this user requirement.
Is there any way for lumen to revert routing url to work with ending / and not working with without ending / ??
or otherwise could you please recommend me to use something else? To match this requirement.
I also tried this service provider still not working link
Regards
Lumen and Laravel should be fine with trailing slashes.
The 404 is likely resulting from a bad nginx configuration.
This is how my nginx config looks like to catch the trailing slash and use the same content at that location.
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
If you're using Nginx, try this config:
index index.html index.htm index.php;
location #rewrite {
rewrite ^/(.*)$ /index.php;
}
location / {
try_files $uri $uri/ #rewrite;
}
I once encountered a similar problem,after debugging with RoutesRequest.php, I discovered that the 5.4 version no longer needs the $query_string or $args things(have no reason why most tutorials still have them).
Hope this helps.If not, maybe you could try debugging with RoutesRequest.php too, adding some helpful outputs will certainly help you locate the problem.

laravel 404 error returning entire page for missing images

I am developing a website in laravel 4.2 and I have used a custom 404 page to display "page not found". Everything works fine but if there are any assets that are not found, like images or js files, the Chrome console shows me the entire 404 page. For every missing asset, the entire 404 page is loaded which is very heavy and not required.
What can i do to return a simple message for assets not found instead of an entire 404 page?
The .htaccess in your public folder is configured to let Laravel handle everything that isn't a file or directory. A simple way to change that for a subdirectory of public, say public/css, is to just put a .htaccess file in this directory and disable Larvel's routing for that folder:
public/css/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine Off
</IfModule>
Then you will get the default Not found page of your webserver when trying to access a non-existing file.
Sidenote: Of course you could also accomplish this using Laravel and some program logic, but this seems the cleanest approach as it doesn't even start up Laravel and thus saves response time and server resources.
Also you should probably do your best to only request files that actually exist to avoid 404s.
I found the solution. Following nginx settings work and display nginx 404 for files not found and custom page for url not found.
rewrite_log on;
try_files $uri $uri/ #rewrite;
location #rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

Laravel quick start guide route not working

Ok I'm new to Laravel so went straight to the documentation to get started. There are massive holes in the documentation so it took a lot of effort and googling to fill the gaps in order to get Laravel set-up. I now have it set up and moved on to the next step in the quick start guide.I created my route
Route::get('users', function()
{
return 'Users!';
});
Now it says:
Now, if you hit the /users route in your web browser, you should see Users!
So I hit up:
http://localhost/laravel/users
but get a 404? I tried
http://localhost/laravel/public/users
but still a 404? I followed the steps on the quick start guide to the letter, what am I missing?
Seems like your Laravel app is accesible via an Apache HTTP alias, because your URL looks like: http://localhost/laravel/. If this is the case and assuming that http://localhost/laravel is pointing to your public directory, then follow these steps:
Try to navigate to your expected route prepend it with /index.php/, in your case: http://localhost/laravel/index.php/users. If it works (no 404) then you problem is with the Rewrite Module configuration of Apache HTTP, you should follow the next steps.
Edit the file public/.htaccess.
Under the line RewriteEngine On add RewriteBase /laravel/.
Try to navigate to an existing route.
Basically, if you app resides in a alias or virtual directory (say http://localhost/alias) you should add an entry in your rewrite rule to rewrite the base directory with alias.
The problem is well explained by Rubens above, A simpler solution is to use the supplied built-in PHP Server by issuing this command
php artisan serve --port=8080
Note that I am using port 8080 here, you can omit it.Now you can browse the site by going to
localhost/users
and it should work!
Apache isn't probably reading the public/.htaccess file due to the directive AllowOverride being set to None. Try to set it to All.
Laravel 4 simple route not working using mod_rewrite, and .htaccess
I had the same problem and spent hours to solve it.
I have several apps under the same domain, but in different segments. So Laravel's url is http://myhostname/mysubdir/
My controllers were only working as http://myhostname/mysubdir/index.php/mycontroller
On /var/www/.../public/.htaccess I put RewriteBase /mysubdir and worked!!!
I know this question is 4 years old but still it have its significance.Rubens Mariuzzo was answered it correctly but I want to add some points on it. You said
"There are massive holes in the documentation so it took a lot of effort and googling to fill the gaps in order to get Laravel set-up"
For beginners it is difficult to find correct way of configuring Laravel. Once it is mastered it is fun developing Laravel :) . There are certain correct way of doing this.
Download Laravel
Configure DB
Map DB in .env
Make auth: php artisan make:auth
Create model and migration together: php artisan make:model Todo -m
Migrate: php artisan migrate
Create controller and routes together: php artisan make:controller
TodoController --resource
Create view for each action
Code the controller
Detailed description is given in this blog http://masterlaravel.blogspot.in/2017/08/laravelquick-start-composer-create.html
please refer to this follow url and see RoboTamer's config:
http://forums.laravel.io/viewtopic.php?id=511
it solved my problem the same as yours
solution in nginx:
server {
server_name .laravel.dev;
root /home/tamer/code/laravel/public;
index index.php index.html;
#browse folders if no index file
autoindex on;
# serve static files directly
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
# removes trailing slashes (prevents SEO duplicate content issues)
if (!-d $request_filename)
{
rewrite ^/(.+)/$ /$1 permanent;
}
# enforce NO www
if ($host ~* ^www\.(.*))
{
set $host_without_www $1;
rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
}
# canonicalize codeigniter url end points
# if your default controller is something other than "welcome" you should change the following
if ($request_uri ~* ^(/lobby(/index)?|/index(.php)?)/?$)
{
rewrite ^(.*)$ / permanent;
}
# removes trailing "index" from all controllers
if ($request_uri ~* index/?$)
{
rewrite ^/(.*)/index/?$ /$1 permanent;
}
# unless the request is for a valid file (image, js, css, etc.), send to bootstrap
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?/$1 last;
break;
}
# catch all
error_page 404 /index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/tmp/php.socket;
fastcgi_index index.php;
#include fastcgi_params;
include /home/tamer/code/nginx/fastcgi_params;
}
access_log /home/tamer/code/laravel/storage/logs.access.log;
error_log /home/tamer/code/laravel/storage/logs.error.log;
}
Thanks. Knowledge of the above by #rubens, and a comment by #GaryJ here made me do this to make it work from my Apache virtual hosts file.
Copied these lines from .htaccess file in laravel within node of the vhosts config.
Removed my .htaccess file (it was anyway not being applied, i am on a windows apache virtual host, laravel env)
RewriteEngine On
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Better:
Later read #Ag0r0 's reply, that worked. i was missing the allow override, making the above neccessary. once allowoverride all was there, the default settings itself worked.
In my case (Ubuntu 14.04 LTS & Apache 2.2) I was stuck at #1 step of #Rubens' solution. I could see the page with this url: http://localhost/laravel/index.php/users but step #2 and others didn't work.
Also I've tried to add RewriteBase /laravel/public to .htaccess but it didn't work too.
Then I've set up a new virtual host with the help of this awesome tutorial: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts (they rock with these tuts)
In addition to tutorial, I've set DocumentRoot (in example.com.conf file) like this:
DocumentRoot /var/www/laravel/public
Yes, public is the big deal here.
Btw, don't put RewriteBase /laravel/ to your .htacces file otherwise you'll get HTTP/500 error.
Now, I can see example.com/users page.
my previous post with the describtion of the problem was deleted, but it was similar to the situation that is described here.
anyway... simply i have tried all the possibilities that are described here as well as on other pages and I did not find solution to my problem.
The fresh installation of the Laraval simply did not worked.... after trying everythink from this post i decided to create yet another fresh installation and miracle happened this installation is actually working...
So my advice is: if you are not able to fix this problem just try to create another installation of the laravel and it might actually work.
This might be actually the easiest way how to fix your problem in case you are starting from the scrach.

Default controller name is removed on browser refresh (CodeigniterPHP/Nginx issue?)

For all pages in my codeigniter app except my default controller, main.php, when I refresh the browser the url isn't affected as one would expect.
However when I refresh the browser at "http://localhost/main", the main part is stripped off the url. So the browser bar shows just "http://localhost".
Totally lost on where to start with this but was just wondering if anyone has come across this before...?
Here's what I think could be the relevant part of my nginx.conf (if Nginx is the problem).
if ($request_uri ~* ^(/main(/index)?|/index(.php)?)/?$)
{
rewrite ^(.*)$ / permanent;
}
Note that changing the bracketed code to this:
rewrite ^(.*)$ /main permanent;
results in the error message The webpage at http://localhost/main has resulted in too many redirects.
Ok I answered my own question. Simply commenting out the nginx.conf code that I showed corrects the problem.
So just do this (says Bo Jackson):
#if ($request_uri ~* ^(/main(/index)?|/index(.php)?)/?$)
#{
# rewrite ^(.*)$ / permanent;
#}
If your trying to route your request to the index.php bootstrap so you can remove the index.php from your url in CodeIgniter you probably should try using this:
location / {
try_files $uri $uri/ /index.php?$query_string;
}

Categories