Support » Requests and Feedback » WordPress's .htaccess file is suboptimal

  • The .htaccess file that WordPress generates during installation is suboptimal.

    The primary issue is that, “out-of-the-box”, the .htaccess file functions properly only when the location of the WordPress installation does not change.

    In a collaborative, version-controlled environment, it is unreasonable to expect that every developer places every WordPress project in his Web-server’s document root. However, the .htaccess file at the root of the installation seems to be generated with this expectation.

    I hardly ever use WordPress, so I can’t speak to the evolution of this issue, but I seem to recall WordPress including the .htaccess file in the actual source package at some point in the past (as opposed to the file being generated dynamically during installation). If my recollection is correct, perhaps the fact that the file is generated dynamically now is in an effort to address the issue I’ve outlined herein.

    The following issues are at the core of why clean-URLs are not accessible when the WordPress installation is not at the Web-server’s document root:

    a.) the leading / before index.php in the last rule (RewriteRule . /index.php [L]); and

    b.) the RewriteBase / directive

    Again, I don’t know enough about WordPress to know whether the proposed adjustments will “break” other functionality, but it seems that two simple adjustments would alleviate this problem entirely.

    # BEGIN WordPress
    
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]
    </IfModule>
    
    # END WordPress

    With these two changes, I am able to move the WordPress installation to any subdirectory of the Web-server’s document root and clean URLs continue to function as expected.

    As a related corollary, the above changes do not address the fact that WordPress stores core configuration directives in the database, so the developer will still need to adjust the ‘siteurl’ and ‘home’ values in the wp_options database table whenever the installation is moved.

    P.S. This forum software is inserting HTML markup into my post (specifically, between the code tags) whenever I edit the post.

Viewing 15 replies - 16 through 30 (of 34 total)
  • Otto (presumably some self-professed WP guru).

    Sorry, but that’s going to make a lot of us laugh for days.

    Otto works for http://audrey.co/ and … well, I’ll tl;dr it for you: Otto knows his shit, and is not a ‘sell professed’ guru, but actually a freakin’ amazeballs coder who works for WordPress. So … when he says stuff, you ought to pay attention.

    (And yes, he can be a hard-headed jerk sometimes, and he’s not what I’d call the most eloquent fellow, but that doesn’t make him wrong. And I’m not just saying that cause we have plans to get a beer this summer.)

    Otto isn’t the only one to support absolute URLs. He is simply following a long-standing design decision of the WordPress core team. As a member, I appreciate and welcome criticism and discussion on various points.

    Our current opinions on the matter are best espoused here, by the lead WordPress developer: http://core.trac.wordpress.org/ticket/17048#comment:46. I quote:

    WP has used absolute URLs since the b2 days. If I had a time machine, it probably wouldn’t. The main reason it still uses absolute urls is because changing doesn’t seem worth the pain. The points here haven’t been ignored, they just aren’t enough to make most us want to mess with this when we could be doing things that people beyond those hanging out in easily amused developer circles care about. If someone wants to patch core in a manner that is fully back compat with existing URL and PATH constants as well as existing values in the DB, I’d be interested in seeing the result.

    Fun thing to do: Try migrating a site that uses relative URLs when the directory it is installed in changes β€” or better, when the directory depth actually changes. (For maximum points, move a root install into a directory.) Finding and replacing absolute URLs in some cases is less insane because they act as nice placeholders, rather than the unfortunate regular expressions that will need to occur. Absolute URLs are sometimes more portable in the ultimate sense. Just saying, relative URLs are not without their own drawbacks.

    I was on the other side of the relative URL debate (as in, disagreeing with Otto). But there’s a very important thing to understand here – developers are not the same thing as users.

    Aside from being hard-headed and simply incorrect on nearly every single front, Otto does a great job of alienating those who should constitute a significant portion of WP’s target audience: developers.

    Yes, developers use WordPress to build sites. We spend a lot of time hacking code and migrating installations from one machine to another. But we are not the end user – our customers are.

    Our customers couldn’t care less about relative versus absolute URLs. They just want the software to work so they can generate content, manage sales, and drive traffic to registration forms. The majority of users (remember, WP is used to power millions of sites) will not be migrating from one box/url to another and will never need relative URLs or the cacophony of things that break when they’re introduced.

    Yes, relative URLs might make life easier for me. They might make things easier for you. They might make things easier for a hundred or so other developers. But focusing on a hundred or so people at the expense of millions of other users is a really bad idea.

    Oh, and for the record I’ll profess right now that Otto is a WP guru. His reputation is well earned in the community.

    In the nicest way, I think everyone needs to take a step back here.

    I disagree with Otto quite often, but I hold both him and his opinion in the highest regard. While I find Ipstenu’s quote accurate, I think this can also be applied to the OP:

    he can be a hard-headed jerk sometimes, and he’s not what I’d call the most eloquent fellow, but that doesn’t make him wrong.

    With that in mind, if we’re going to cut people some slack, lets also cut the people we dont’ know some slack too πŸ˜‰

    The OP has some really good points. Absolute URLS in WP are a nightmare. Which is not to say that Absolute URLS are wrong, but our implementation of them is a royal pain in the behind.

    I’ve talked often and loudly in the last 2 years that WordPress currently doesn’t scale well, a phrase that send people into fits of hysterics. I do not mean in terms of Servers/PHP/hits, i mean in terms the number of decisions that are locked down on the basis that “they work for .com/bloggers”.

    Moving WP installs, having master/slave or dev/live installs and all the rest of it causes real issues. Which is fine, or acceptable, if we were to admit that and write a codex article on it. Instead we valiantly defend WP instead of being able to do anything, and just hope that everyone has the same level of knowledge and experience as we have.

    Lets be honest, we get a request/moan about this at least once a week on the wp dev / hackers mailing lists. Maybe we should consider nipping this in the bud rather than just telling people that a) the decision was made in 2002 and it’s not going to change and 2) it works for millions therefore nothing is going to change (unless we want it to).

    TBH, we can’t keep making the ‘millions of users’/’scared of change’ comments and roll out Capital_P_Dangit / inaccessible-menu. (not to open those can of worms)

    Ipstenu, at the risk of sounding like a prick, I don’t really care what Otto’s credentials might be. I’ve seen enough to know that we disagree fundamentally on several points that extend well beyond WordPress. I’ve been coding at least as long as he has and if the WP core is in any way his opus, I am not moved.

    Thanks for the insight and link, Andrew.

    So, why didn’t anybody say, “It was indeed a poor design decision, and, unfortunately, one with which we’ve had to live due to backwards compatibility requirements. Marcus Pope has developed a plug-in that may allay your concerns for the time being, and work is underway to address this shortcoming in the longer term.”

    Fun thing to do: Try migrating a site that uses relative URLs when the directory it is installed in changes β€” or better, when the directory depth actually changes. (For maximum points, move a root install into a directory.)

    To be clear, I don’t think anybody is advocating “purely” relative URLs that do not require post-processing (whether at the Web-server or PHP level). Everybody on the relative-URL side of the debate seems to acknowledge that constant-defined values would need to be prepended to the URLs whenever the content must be “exported” (that is, not simply displayed via http[s] on the server on which the content is hosted).

    For those who suggest that post-processing URLs is “off the table” due to resource requirements, the fact that a stock WP installation uses 34MB of memory to serve each page request should be cause for far greater concern. But that’s another topic for another thread.

    Finding and replacing absolute URLs in some cases is less insane because they act as nice placeholders, rather than the unfortunate regular expressions that will need to occur. Absolute URLs are sometimes more portable in the ultimate sense. Just saying, relative URLs are not without their own drawbacks.

    There is truth to these statements, and I certainly acknowledge that relative URLs are not without drawbacks.

    One of the things that we did was to ensure that all hardcoded local link to posts and images was to use a simple bbcode/shortcode hook.

    POSTS:
    e.g. “link.com/post-name” became [site_url]post-name

    MEDIA:
    e.g. “link.com/wp-content/uploads/month/year/image.jpg” became [image_url]image.jpg

    This made a COLOSSAL difference to us when dealing with multiple users and installs.

    As a really nice touch, when we moved to using a CDN for our images, we simply replaced IMAGE_URL in the config file and BAM, no database issues, it automatically pulled all images from the CDN URL.

    I know this sounds like a daft statement, but given that we can (and should) be defining SITE SPECIFIC information in the WP config file doesn’t it stand to reason that something as purely site specific as site_url should be defined there too? Coding issues aside, that just seems sensible…

    I’m struck with an idea:

    Why not do something similar to what Mark Jaquith’s Markdown On Save plugin does? It stores the final rendered content in the normal places, but stores the Markdown in post_content_formatted, so that if the plugin ever gets deactivated, no rendering impact is felt.

    Why not do something similar for relative vs. static links? Store shortcode-style prefixes, render to HTML on save and be done with it?

    Fun thing to do: Try migrating a site that uses relative URLs when the directory it is installed in changes β€” or better, when the directory depth actually changes. (For maximum points, move a root install into a directory.)

    Actually, I think this is wrong and a little old fashioned. We recently moved 2 different CMS’ (on different platforms) with a mixture of relative and referenced links and it was smooth as silk.

    You see, there is a 3rd option: Absolute, Relative and “referenced”.

    We already have the site_url as a reference point that we can refer to at any point on the loading of a WordPress page (even prior to initialising the DB is people define it in the WP_config which they should always do); so the questions remains as to WHY we would hardcode ABSOLUTE URLs when we could just reference the URL at any given moment?

    I’m not advocating a change, it just seems to me that rather that take the ‘extendable’ solution, the core team took the lead from a decision made by B2 in 2001/2002, and continued with a solution that only worked in 1 situation.

    More importantly, I think it’s a little (unintentionally) disingenuous to be pointing out the 10 year old decision, when the MAJOR culprit of the absolute url issues are:

    1) Local links to posts in the content editor (added in 3.1)
    2) Local links to media in the content editor via Media manager (added in 3.3)

    90% of the Absolute vs. Relative vs. Referenced URL issues could have been cleared up in the last 18 months with 2 quick fixes.

    The bigger issue is not about absolute URLs, but about hardcoded URLS in multiple places with multiple dependancies. Why not have URLs reference a single place (site_url)?

    One of the things that we did was to ensure that all hardcoded local link to posts and images was to use a simple bbcode/shortcode hook.

    POSTS:
    e.g. “link.com/post-name” became [site_url]post-name

    MEDIA:
    e.g. “link.com/wp-content/uploads/month/year/image.jpg” became [image_url]image.jpg

    Is this shortcode solution available as a plugin? I have a feeling it would satisfy the devs/users who need such a solution without needing to draw on this debate over absolute/relative/referenced URLs in core.

    Can you guys not talk about me while I’m hungover? It hurts my brain. πŸ˜‰

    In other words, I would prefer that WP store the siteurl and home values in wp-config.php, as opposed to the database.

    Add two lines to your wp-config.php file:

    define('WP_HOME','http://example.com');
    define('WP_SITEURL','http://example.com');

    Magic.

    @eric:

    I’m afraid it’s not available as a plug-in as many our EnterPress (poor name, we thought it was funny at the time) functionality required Core Hacks. I’m happy to flesh-out what we have next weekend and use an “on_save” hack to replace… I’ll see how bad it looks.

    More over though, I think this is a good debate to have, though I appreciate some folks haven’t enjoyed the tone of the OP, I know I’m one whose tone isn’t always loved either πŸ˜‰

    If you excuse my very poor translation “la partie Γ©mergΓ©e de l’iceberg” is the french equivalent of the English “tip of the iceberg”, but it actually as a phrase has a very different meaning in context.

    The french use it almost as a warning to mean that you’ve only thought of the bit you can see; while in English its more of.. we know there’s more to sort later.

    While continuing to make me even more unpopular than I already am, I am strongly of the opinion that “we” (for the most part the Core team and those whose opinion they like – but there is some community involvement) solve issues by numbers: i.e. What will solve this issue for 80% of users?

    The problem is, as I’m often told, if 50% of WP users are on “.com” there is NO possible way that a solution will enter into WordPress until it leads to a huge RoI from “.com”/bloggers. The problem with that 80/20 rule is that 20% of over 20million = millions of edge cases.

    What I struggle with is that the conversations I see never evolve round how much work is required to done something the “right/extendable” way, to work out if it’s worth the Return on Investment; instead they focus on how much development time there is to make things work. Sometimes, a very small amount of work is required to make something extendable enough to cater for the other 20%.

    Take my example for a second of using a shortcode instead of hardcoding the URL when we added the internal-linking in 3.1 or the new media manager in 3.3. We all know I’m the most faded low watt bulb in the box, especially in comparison to some of exceptionally bright people in this thread – but holy crap – I can’t have been the only person who thought of NOT hardcoding something. I mean, NOT hardcoding seems almost more obvious than hardcoding things. More over, I raised it as an issue to a WP core developer after 3.1 came out. *tumbleweed*

    Thats my big thing, heck its always been my big thing. My business card says “failed developer” on it (thats not a joke), and I will always bow to y’all on what can and cant be done technically. But far too many of our decisions in the last 2 years have been short-term and “.com” focussed. Conversations like this, even if they start in a bad place, have the potential to provide a solid understanding of the pain points that those of us using WordPress “in the wild” are facing.

    I am reminded, often, of this:
    http://kevinjohngallagher.com/2012/01/listening-core-skill-learning/

    @ Otto:

    Thats awesome bro πŸ™‚
    Now where does that get referenced instead of the database for every call?

    You forgot:

    define('WP_VARIABLE','does_not_matter_as_its_been_hardcoded_multiple_times');

    πŸ˜‰

    (trying to keep it light incase you’re still hungover)

    Kevin, while I appreciate the fact that you seem to agree that the status quo is less than ideal, I’m not sure why my tone is of particular issue to you.

    I didn’t come in “guns blazing”. I began with a pragmatic post that was intended to be inert of tone or bias. If you read the first paragraph of my second post, this fact should be evident.

    It was after I was told several different ways, “That issue does not exist”, “You’re doing it all wrong”, “That’s a stupid thing to do”, “Learn to do XYZ”, and similar that my tone changed.

    Moreover, when someone (not you) implies that I should bow to another developer because he is the best developer that ever lived, and everything he does is impervious to scrutiny and criticism, it doesn’t make me want to contribute to any community of which said member is a vocal part. Especially when all evidence is to the contrary.

    cbj4074,

    Genuinely no offence was meant, and I’m almost fine with your tone (for the most part). But on a support forum, especially with lovely volunteers such as Ipstenu, manners and tone go a really long way to smoothing the waters. This wasn’t very nice though:

    at the risk of sounding like a prick, I don’t really care what Otto’s credentials might be.

    Its funny, I was introduced as “The Most Hated man in WordPress” (trademark) at this year’s WP Scotland event because my tone is about as harsh as the WP community can take. More than any other community I’ve ever been involved with, the WP community is “sensitive”, and it’s very important to end your sentences here with smiley faces or emoticons if you’re going to say something thats not 100% inline with the status quo πŸ™‚

    Ipstenu, Andrea, Andrew Nacin, Eric Mann and Otto are all people who i’ve strongly disagreed with over the years about one thing or another (heck Ipstenu and I used to go at it about bbPress back when that was a real thing and not a figment of the WP plug-in directories imagination); and they’re all people I respect the heck out of even when we don’t agree.

    I think we all agree that WP isn’t perfect, but there’s a very specific tone that these good folks respond to, and a particular phrasing that gets a good deep-dive response. It’ll take some time to nail it, and while folks like me cant help but bring up f*** ups like Capital P Dangit making every arabic wordpress site blasphemous because some crazy Texan only thinks in a limited viewpoint, you can join me on the naughty step πŸ˜‰

    Kevin, I’m not the least bit offended by your remarks, but I appreciate the community backgrounder all the same.

    You seem like a nice guy. In fact, I’m sure I’d have a rollicking good time with anybody on these boards were we to meet over a beer at a WordPress event. That said, I have no intention of pandering to sensitive egos where software development is concerned (nor community support, for that matter).

    I’m not suggesting that there’s no place for general politeness, but placating “VIP” community members is of little interest to me. I contribute the bulk of my free time to libre and gratis open-source software projects, and I’ve “seen it all” in the way of community dynamics. The communities in which the members keep their discourse terse, their posts factual, and their feelings on the side-lines are the most productive. If it wasn’t obvious, I’m not here to make life-long friends and prepare for the next meet-up.

    Perhaps my perceived arrogance stems from the fact that I am sufficiently qualified not to rely on anybody here for help. I was providing feedback, not asking for assistance. I attempted to do so in a nuts-and-bolts manner, stating only the facts, and even offered a potential (if not partial) solution. As cold as it may sound, I have no investment in WordPress’s future, and its fate is not something over which I lose sleep.

    If anybody ought to be given tips on decorum, it is the “respected” WP community members after they alienate new members who are probably as qualified as their most heralded core developers (if not more so in some cases). One never knows who’s behind the keyboard and who could be a star contributor.

    Anyway, we’ve derailed the thread sufficiently, so I’ll leave it to those who are still being productive. And a πŸ™‚ for good measure.

    @ Otto:

    Thats awesome bro πŸ™‚
    Now where does that get referenced instead of the database for every call?

    You forgot:

    define(‘WP_VARIABLE’,’does_not_matter_as_its_been_hardcoded_multiple_times’);

    πŸ˜‰

    Not following you there, or understanding the question. If you hardcode the SITEURL and HOME variables with defines, then it overrides the “siteurl” and “home” variables from the database. The defines will be returned for all calls that reference the site url.

    If you’re referring to the absolute URLs being in the post content, then yes, that will still be there. As it should be. URLs in the post content should be absolute for disambiguation purposes (content should never be tightly tied to context). Also, absolute URLs in the post content makes migration easier, not harder. It becomes a simple search/replace operation to fix URLs instead of a complex regexp nightmare.

Viewing 15 replies - 16 through 30 (of 34 total)
  • The topic ‘WordPress's .htaccess file is suboptimal’ is closed to new replies.