Pretty URLs without mod_rewrite, without .htaccess
Solution 1
If you've the permissions to set custom error documents for your server you could use this to redirect 404 requests.
E.g. for Apache (http://httpd.apache.org/docs/2.0/mod/core.html#errordocument)
ErrorDocument 404 /index.php
In the index.php you then can proceed your request by using data from the $_SERVER array.
Solution 2
You can also have urls like
http://domain.com/index.php/Blog/Hello_World
out of the box with PHP5. You can then read the URL parameters using
echo $_SERVER['PATH_INFO'];
Remember to validate/filter the PATH_INFO and all other request variables before using them in your application.
Solution 3
I know this question is very old but I didn't see anyone else suggest this possible solution...
You can get very close to what you want just by adding a question mark after the domain part of the URL, ie;
http://www.example.com/?Blog/2009/12/10/
http://www.example.com/?Title_Of_This_Page
Both of the above HTTP requests will now be handled by the same PHP
script;
www.example.com/index.php
and in the index.php
script, $_SERVER['REQUEST_URI']
for the two pages above will be respectively;
Blog/2009/12/10/
Title_Of_This_Page
so you can handle them however you want.
Solution 4
A quite simple way is to:
- declare a 404 ErrorDocument (e.g. PHP) in
.htaccess
- parse the query using
$_SERVER
and see if it corresponds to any result - if so replace the HTTP status 404 with status 200 using
header()
and include index.php
Solution 5
If you omit a trailing slash, Apache will serve the first file [alphabetically] which matches that name, regardless of the extension, at least on the 2 servers I have access to.
I don't know how you might use this to solve your problem, but it may be useful at some point.
For example if
http://www.somesite.com/abc.html
and http://www.somesite.com/abc.php
both exist and http://www.somesite.com/abc
is requested, http://www.somesite.com/abc.html
will be served.
Comments
-
Kriem almost 2 years
Without a possibility to access .htaccess I find myself in a creative impasse. There is no mod_rewriting for me. Nevertheless, I want to be able to do the nice stuff like:
http://www.example.com/Blog/2009/12/10/ http://www.example.com/Title_Of_This_Page
What are my alternatives?
In respond to the answers:
- I'm building with php5
- I don't have access to .htaccess
http://www.example.com/index.php/Blog/
is a known technique but I don't prefer it. Is shows the php so to say.- How would I create extensionless PHP-files? Would this do the trick?
- How much would using the custom 404 technique hurt performance?
-
Stefan Mai almost 15 yearsAh, beat me to it. I thought about this for 5 minutes and finally came up with the same thing.
-
chaos almost 15 yearsThe document returned still has a HTTP 404 status on it, not a 200. This will cause a lot of problems with web crawlers.
-
Piskvor left the building almost 15 years@chaos: <?php header('HTTP/1.1 200 OK'); ?>
-
Piskvor left the building almost 15 yearsThe question, again, becomes, how to do that w/o .htaccess. Some webhosts do offer a custom 404 in their configs, though, so this would be possible.
-
Kriem almost 15 yearsI'm aware of this technique. I changed the question asking for a way without this method. It's an alternative nevertheless so you're right. I just don't prefer this one.
-
Maciej Łebkowski almost 15 yearsYou cannot POST (i.e., you can, but the data will be lost) to an error document script.
-
instanceof me almost 15 yearsRight. I don't see any solution without either being able to choose (or edit) your 404 ErrorDocument or use a .htaccess, because you have to set this up at request-hendling level... Or use the solution you don't like:
index.php/Blog/...
-
chaos almost 15 yearsYeah, I see that now. Edited per.
-
Philippe Gerber about 13 years@Maciej Łebkowski: that should not be a problem because clients usually do not POST to you themselves (you say when and to which resource).
-
aalaap about 10 yearsIf you use switch-case, send a
200 OK
header before theswitch
, send the404 Not Found
header in thedefault:
case and finally wrap the whole router around withob_start()
andob_end_flush()
. This way the200
gets sent to all, but the else case sends a404
, which overwrites the earlier200
. -
Synox about 9 yearsYou are refering to the Option
MultiViews
in apache. This option can have unwanted side effects. httpd.apache.org/docs/current/mod/mod_negotiation.html -
Wes over 4 yearsI actually just implemented something like this and found that the single question mark served well to call the index.php page without exposing it as the handler. it's not as clean but it still works without having to configure the web server rewrite rules.