Reputation:
So, I'm trying to make my URL's a bit more pretty and sharable. I have a website with some items that users can currently access with example.com/?i=itemName
. However, I'd like users to be able to write example.com/itemName
instead.
This means I'd have to do some redirection with htaccess. I want to redirect all URL's to example.com
itself, but keep the URL the same. To clarify, an example:
User types example.com/niceItem
. The server shows the content of example.com
, but keeps the URL as example.com/niceItem
(alternatively, it can change the URL to example.com/?i=niceItem
, then I can simply read the URL with javascript and change it back to example.com/niceItem
in the adress bar).
So far, this is the best I could do:
RewriteRule ^/([^\/]+)$ /index.php?i=$1 [NC,L]
The idea is to capture the requests that don't have slashes after the first one (like example.com/niceItem
), and then read the file at example.com/index.php?i=niceItem
. The problem is, when I load a page like example.com/niceItem
, the page displays what the value of i
is with php; it should be niceItem
, as the link is supposed to be example.com/?i=niceItem
, but the value of i
is actually the string index.php
. Not quite what I wanted. Also, I'd expect the following to work
RewriteRule ^/([^\/]+)$ /?i=$1 [NC,L]
but this actually causes an internal server error.
So, the question is, why do those not work, and how would I be able to achieve what I'm trying to achieve?
example.com
. So, I have sub.example.com
which maps to example.com/sub/
, and I need the URL's to be prettyfied like sub.example.com/itemName
or example.com/sub/itemName
. As I mentioned, the format of the URL isn't that big of a deal as long as the itemName
part is in there. I'll be able to read the URL with javascript and change it to whatever I want once the page has loaded.
Upvotes: 0
Views: 39
Reputation: 108
Use RewriteCond
If i is the only query argument that will be passed then
RewriteCond "%{QUERY_STRING}" "(\?i=)(.*)$"
RewriteRule "(.*)/?$" "$1/%2"
If you need to extract i only but keep other query args
RewriteCond "%{QUERY_STRING}" "(.*(?:^|&))i=([^&]*)&?(.*)&?$"
RewriteRule "(.*)/?$" "$1/%2?%1%3"
Most every framework provides this sort functionality. It is best not to reinvent the wheel when possible. This is a fragile setup, and it will probably cause you headaches in the future.
Upvotes: 0