my htaccess rule isn't working with rewrite with dashes in:
RewriteRule ^([A-Za-z]+)$ index.php?do=$1 [QSA]
so, www.domain.com/rules works, however, www.domain.com/about-us doesn't
I've verified that www.domain.com/index.php?do=about-us works so it's definately a rewrite issue.
Thanks.
Your regular expression doesn't include a check for dashes - try:
RewriteRule ^([A-Za-z\-]+)$ index.php?do=$1 [QSA]
Your regex only takes a-z and A-Z, change it to [A-Za-z\-] so it will include the - character
Related
Okay, so I need to find the correct syntax for what I want to do.
These links:
http://www.example.com/sub1/sub2/product1/
(...)
http://www.example.com/sub1/sub2/product700/
need to redirect to
http://www.example.com/sub3/product1-newsite/
(...)
http://www.example.com/sub3/product700-newsite/
What I have tried:
RewriteEngine On
RewriteRule ^/sub1/(.*)/(.*)$ http://www.example.com/subdir/$1-newsite/ [R=301,L]
For all the 700 products.
Also I need to make exeptions for certain products.
Can someone see what I'm doing wrong?
I think it's just the numbering on the regular expression that is an issue.
$1 is the first matched group, $2 is the second, etc. $0 is for the entire string that matched (ie. the whole path).
Try:
RewriteEngine On
RewriteRule ^/sub1/sub2/(.*)$ http://www.example.com/subdir/$1-newsite/ [R=301,L]
or
RewriteEngine On
RewriteRule ^/sub1/(.*)/(.*)$ http://www.example.com/subdir/$2-newsite/ [R=301,L]
Edit
Ah... had a thought... the first regex in the capture may be being a bit too greedy... since it can match:
^/sub1/[sub2/product1-newsite]/[] so $1 will be sub2/product1-newsite and $2 will be empty (.* can happily match nothing).
So we need to make sure it doesn't grab too much.
RewriteEngine On
RewriteRule ^/sub1/([^/]+)/(.+)/$ http://www.example.com/subdir/$2-newsite/ [R=301,L]
Changing the * to + makes sure we match at least one character.
Changing the . to [^/] makes sure we match "anything except a /".
Added a / on the end to make sure the $2 doesn't capture the trailing slash.
That should hopefully fix it.
i have to redirect some old page to new page i used below commend in .htaccess
RewriteRule ^Savane-98.htm$ savane-tc-9347-41-belgian-tapestry-throw [R=301,L]
it works fine but some of my old link have parentheses '()' it don't work how can i solve that . like below link
RewriteRule ^antique-bronze-square-end-rod-(flat-to-wall)-tapestry-wall-hanging-rod$ antique-bronze-square-end-rod-flat-to-wall-tapestry-rod [R=301,L]
this link don't work can anyone help me
Thanks
Parentheses are special characters in regular expressions - they denote the beginning and end of a matching group.
In order for them to be treated as literal parentheses by the regular expression engine, they need to be escaped with a backslash (\):
RewriteRule ^antique-bronze-square-end-rod-\(flat-to-wall\)-tap...
I have following link:
http://www.svensonart.com/index.php/nl/artists/
I want to remove the index.php with IIRF, wich is no problem i use this rule:
RewriteRule ^/(.*)$ /index.php/$1 [I,L,QSA]
But when I have an URI with special charachters é è ö ,.. the rewriterule is not working. So if I want to rewrite this url:
http://www.svensonart.com/index.php/nl/artists/view/Lindstr%C3%B6m_Bengt
its not working.
Anybody any idea's why?
There isn't a rewrite flag for preventing a regular expression grouping from getting decoded, but there's an IIRF directive called UrlDecoding which you can try in your INI file:
UrlDecoding Off
I'm german and i'm sorry about my damn sucking englisch.
RewriteRule ^admin/(.*)$ index.php?admin=$1
here is an example.
so the result i want is for example the id within, but as an optional parameter:
RewriteRule ^admin/(.*)/id-(.*)$ index.php?admin=$1&id=$2
Here the id don't must set thats what i want :)
The Link example (i want that here is the same result):
www.exmple.com/admin/edit-user
www.exmple.com/admin/edit-user/id-1
the problem is: the rule take anytime the first way with only this:
RewriteRule ^admin/(.*)$ index.php?admin=$1
can anybody help me ? :)
loving greetings m0.
Try changing the order of your rules and don't forget the [L] flag at the end :
RewriteRule ^admin/(.*)/id-(.*)$ index.php?admin=$1&id=$2 [L]
RewriteRule ^admin/(.*)$ index.php?admin=$1 [L]
Try an optional capture group:
RewriteRule ^admin/([^/]*)(/id-(.*))?$ index.php?admin=$1&id=$3
If there's no id specified, then $3 will be blank and you'll just get a blank id rewritten:
index.php?admin=edit_user&id=
If it is specified, then you'll get the id too:
index.php?admin=edit_user&id=1
The expression .* is too general as it matches an arbitrary length of arbitrary characters. A better expression would be [^/]+ that matches only one ore more arbitrary characters except / (path segments separator).
So try these rules:
RewriteRule ^admin/([^/]+)$ index.php?admin=$1
RewriteRule ^admin/([^/]+)/id-([^/]+)$ index.php?admin=$1&id=$2
For the second rule you could also replace the second [^/]+ with [1-9][0-9]* that would match only integers greater than 0.
RewriteRule ^admin/([^/]+)/id-([1-9][0-9]*)$ index.php?admin=$1&id=$2
try this:
RewriteRule /admin/([^/]*)/?(id-(.*))?$ index.php?admin=$1&id=$3
RewriteCond %{REQUEST_URI} !^/?new.php?url
RewriteRule ^/?(.+)\.?(.+)$ new.php?url=$0 [L]
its supposed to take any URL
mysite.com/someurl
and convert it to
new.php?url=someurl
however it keeps going to just new.php
You need to escape the second question mark in the first line so it matches a literal question mark:
RewriteCond %{REQUEST_URI} !^/?new.php\?url
Also you are not using the parenthesized groups on the second line. $0 is okay, or you may want $1 instead. If you use $0 you could simplify it a bunch:
RewriteRule ^.*$ new.php?url=$0 [L]
Or on the other hand if you're breaking apart the URL for a reason I would suggest some fixup. You're not matching the file name and extension exactly right. A little more complex regex like this would probably do you better:
RewriteRule ^/?(.*?)(?:\.([^.]*))?$ new.php?path=$1&extension=$2 [L]
Explanation:
(.*?) matches the directory and file name. The ? means match non-greedily, so stop as soon as the next part matches. The parentheses cause it to be captured and stored in $1.
(?:\.([^.]*))? matches the file extension. ?: turns says to not capture the outer set of parentheses, so the dot is not captured in $2. ([^.]*) matches the extension and ensures that it does not contain a dot. The final ? makes the file extension part optional, just cause not all URLs have file extensions. Thus there will only be a $2 if there is a file extension.
The first back-reference is $1 not $0 AFAIK. If that doesn't do it try specifying [QSA] as well, though I doubt that's it.
RewriteCond %{REQUEST_URI} !^/?new.php?url
RewriteRule ^/?(.+)\.?(.+)$ new.php?url=$1 [L]
The first back reference should be $1 instead of $0.
RewriteCond %{REQUEST_URI} !^/?new.php?url
RewriteRule ^/?(.+)\.?(.+)$ new.php?url=$1 [L]
It also depends on what other lines of code you have in the file. It's also possible to mess up rewrites if you have another code that conflicts with it.