Friendly URL structure
Oracle has updated apex.oracle.com to APEX 20.1 which includes among other features the new “Friendly URL” option. The legacy URL structure concatenated a string of parameters into a single “p” parameter, which works fine; but it can make it difficult to configure web server rules to match and rewrite URLs. Apart from the application ID or alias (the first part), all the parameters are optional; if all were specified the URL will be something like this (line breaks added for clarity):
f?p=SAMPLE_DB_APP:HOME:16801234560918:myrequest:mydebug :myclearcache:myitems:myvalues:myprinterfriendly &p_trace=mytrace &cs=19A56DBFDXXXE4DF293C96D786 &c=jk64
In this example, the application alias is used (
SAMPLE_DB_APP) and page alias (
HOME) followed by the session ID etc. I’ve also specified the workspace (
jk64) using the “
c” query parameter.
In APEX 20.1 if you edit your Application Properties, you will see the new “Friendly URLs” setting.
With this setting turned on, URLs generated throughout the application will take this form (this is not exhaustive, there are other query parameters supported as well):
/pls/apex/jk64/r/sample_db_app/home ?myitems=myvalues &request=myrequest &clear=myclearcache &debug=mydebug &printerFriendly=myprinterfriendly &session=16801234560918 &p_trace=mytrace &cs=19A56DBFDXXXE4DF293C96D786
When the documentation says the URLs should be “easier to read” I’m pretty sure they mean “by developers”, not end users. I suppose this means the URLs make more sense to developers of other web-based applications, because they conform better to REST URL conventions.
In its simplest form, the URL generated by APEX will include just the workspace path prefix, application, page, and session ID:
APEX_PAGE.GET_URL generates the URLs correctly for the application according to whether the Friendly URL setting is on or not.
I noticed the following features of this new format:
- The URL generated by
APEX_PAGE.GET_URLnow includes a full path (excluding the domain).
- Instead of the “
c” workspace query parameter, the application’s Path Prefix (which could be set to something other than the workspace name) is used (
jk64in my example). This is not the workspace name, although in most cases it usually will happen to be the same because it’s defaulted that way. This attribute is set at the workspace level, under Administration / Manage Service / Set Workspace Preferences / SQL Workshop.
- If not specified, the application and page alias will be used rather than the application or page ID, which is nice.
- Even if you specify the application or page alias in uppercase,
APEX_PAGE.GET_URLreturns them in all lowercase.
- The more important attributes relevant to a user navigating the application are now further towards the start of the URL, such as page and item values, so they will be more likely to be noticed by the end user.
- The “
/r/” bit in the URL is just that. It’s just “r” and can’t be anything else, don’t ask me what it means. EDIT: apparently it stands for “router”…
If your users have bookmarked your application using the legacy URL format, you can still safely upgrade your application to use Friendly URLs because both are still supported. This also means that if you have some old code that generates links programmatically they should still work the same (although it is best practice to call
APEX_PAGE.GET_URL for this purpose).
In case you’re wondering, it is not possible to change the URL format when calling
APEX_PAGE.GET_URL, it will follow your application’s Friendly URL setting. If you call
APEX_PAGE.GET_URL for another application, it will return the correct format of URL for the target application. If you call
APEX_PAGE.GET_URL for an application that does not exist, it will return the URL in the legacy format.
Existing applications after upgrading, or ones you import from an older version of APEX, will still use the legacy URL syntax. New applications will use the new Friendly URLs by default – but you can revert them to the legacy URLs if you wish.
On a side note, in earlier versions when you create a new application the application alias was set to the application ID by default. In APEX 20.1, a new application will have an application alias generated from the initial application name; when I tried it, it added a number as well for some reason.
At this very early stage, the legacy URL format is still fully supported – I imagine it will eventually be deprecated, but not yet.
Finally, I’d like to point out some entries on the APEX Feature Requests site:
Our patience has been rewarded 🙂