Page is a not externally linkable
- Code, Content, and Presentation
-- Apache Web Server
---- Issues running CMS in subfolder


g1smd - 6:25 pm on Jan 10, 2013 (gmt 0)


The URL for the index pages should be
example.com/ and example.com/laplume/ - that is what you should be linking to in the navigation links of your site as href="/" and href="/laplume/".

Mod_rewrite should detect those requests as
^$ and ^laplume/ and internally rewrite as appropriate.

Each of your individual rewrite rules are over-complicated and the ruleset itself doesn't enforce canonicalisation.

Rules 31-32 and 34-35 are your rewrites coded more efficiently.

Rules 32b+35b can replace 32a+35a and then allows both of your sites to have sub-folders.

Rules 33+36 deal with requests for images, stylesheets and scripts.


Rules 21 to 25 are the extra redirects you will need to prevent direct access to scripts and enforce canonicalisation.


Options +FollowSymLinks
RewriteEngine on

ErrorDocument 404 /error404.php


# 1. Rules that block malicious requests go here.

# 11. Block access
RewriteRule ^/(laplume/)?/cms/inc/(menu|list)\.php$ - [F]


# 2. External Redirects

# 21a. Redirect for index or index.php URL request in /laplume/cms/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /laplume/cms/([^/]+/)*index(\.php)?\ HTTP/
RewriteRule ^laplume/cms/(([^/]+/)*)index(\.php)?$ http://www.example.com/laplume/$1? [R=301,L]

# 21b. Redirect for folder URL request in /laplume/cms/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /laplume/cms/([^/]+/)*\ HTTP/
RewriteRule ^laplume/cms/(([^/]+/)*)$ http://www.example.com/laplume/$1? [R=301,L]

# 21c. Redirect for page or .php file URL request in /laplume/cms/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /laplume/cms/([^/]+/)*[^/.]+(\.php)?\ HTTP/
RewriteRule ^laplume/cms/(([^/]+/)*[^/.]+)(\.php)?$ http://www.example.com/laplume/$1? [R=301,L]

# 22a. Redirect for index or index.php URL request in /laplume/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /laplume/([^/]+/)*index(\.php)?\ HTTP/
RewriteRule ^laplume/(([^/]+/)*)index(\.php)?$ http://www.example.com/laplume/$1? [R=301,L]

# 22b. Redirect for .php file URL request in /laplume/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /laplume/([^/]+/)*[^/.]+\.php\ HTTP/
RewriteRule ^laplume/(([^/]+/)*[^/.]+)\.php$ http://www.example.com/laplume/$1? [R=301,L]

# 23a. Redirect for index or index.php URL request in /cms/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /cms/([^/]+/)*index(\.php)?\ HTTP/
RewriteRule ^cms/(([^/]+/)*)index(\.php)?$ http://www.example.com/$1? [R=301,L]

# 23b. Redirect for folder URL request in /cms/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /cms/([^/]+/)*\ HTTP/
RewriteRule ^cms/(([^/]+/)*)$ http://www.example.com/$1? [R=301,L]

# 23c. Redirect for page or .php file URL request in /cms/ folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /cms/([^/]+/)*[^/.]+(\.php)?\ HTTP/
RewriteRule ^cms/(([^/]+/)*[^/.]+)(\.php)?$ http://www.example.com/$1? [R=301,L]

# 24a. Redirect for index or index.php URL request in root folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index(\.php)?\ HTTP/
RewriteRule ^(([^/]+/)*)index(\.php)?$ http://www.example.com/$1? [R=301,L]

# 24b. Redirect for .php file URL request in root folder
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*[^/.]+\.php\ HTTP/
RewriteRule ^(([^/]+/)*[^/.]+)\.php$ http://www.example.com/$1? [R=301,L]

# 25. non-www/www canonicalisation redirect
RewriteCond %{HTTP_HOST} !^(www\.example\.com)?$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]


# 3. Internal Rewrites

# 31. Rewrite example.com/laplume/ URL request
RewriteRule ^laplume/$ /laplume/cms/index.php [L]

# 32a. Rewrite example.com/laplume/pages URL requests
RewriteRule ^laplume/([a-z0-9-]+)$ /laplume/cms/$1.php [L]

# 32b. Rewrite example.com/laplume/FOLDER/pages URL requests
# RewriteRule ^laplume/(([^/]+/)*[a-z0-9-]+)$ /laplume/cms/$1.php [L]

# 33. Rewrite example.com/laplume/FOLDER/ file requests
RewriteRule ^laplume/(([^/]+/)*[a-z0-9-]+\.(css|jpg|js|png))$ /laplume/cms/$1 [L]

# 34. Rewrite example.com/ URL request (root)
RewriteRule ^$ /cms/index.php [L]

# 35a. Rewrite example.com/pages URL requests
RewriteRule ^([a-z0-9-]+)$ /cms/$1.php [L]

# 35b. Rewrite example.com/FOLDER/pages URL requests
# RewriteRule ^(([^/]+/)*[a-z0-9-]+)$ /cms/$1.php [L]

# 36. Rewrite example.com/FOLDER/ file requests
RewriteRule ^(([^/]+/)*[a-z0-9-]+\.(css|jpg|js|png))$ /cms/$1 [L]



Rules 32b+35b can replace 32a+35a and then allows both of your sites to have sub-folders.

Rules 33+36 deal with requests for images, stylesheets and scripts.

The above code is untested and might have a typo somewhere.

You should restrict your URLs to lower case and digits and hyphens; i.e. not allow underscore or upper case (I already changed the patterns).


Thread source:: http://www.webmasterworld.com/apache/4533901.htm
Brought to you by WebmasterWorld: http://www.webmasterworld.com